2016-06-22 6 views
2

PL-SQLには、テーブル関数、オブジェクト、およびおそらく私がまだ発見していない他の新しい概念があります。モジュラーコードの良い習慣は何ですか?

しかし、ここでもまた、すぐに実行できる単純なコード生成(動的なpl-sql)もあります。

これらはコードの再利用に役立ちます。

テーブル関数とオブジェクトはモジュラーコードを作成するのに役立ちますが、それでも全体を削除するには不十分です(多分私はそれらの中で最高のものを使用していないかもしれません;今はデータであり、ロジックなし)。

コード生成ははるかに簡単で、重複したコードをもっと減らすことができます。しかし、実際のビジネスがコード生成ロジックの背後にあるものを読むのは難しいことです。

モジュラーで重複しないコードが必要です。私はプレーンコードの生成に固執すべきですか?それぞれの長所と短所は何ですか?

+1

"コード生成"とは、動的PL/SQLを意味しますか?動的PL/SQLはその場所を持っていますが、何らかの理由で静的PL/SQLコードが不可能な場合にのみ、あなたがもちろんのこととして使用するべきではありません。 –

+0

はい、動的plsqlです。私が望むものは、提案された制限(「コンパイル時にテキストが不明なSQL」または「静的SQLとしてサポートされていないSQL」)のいずれにも従わない。それはちょうど私が欲しいもののために簡単に思える。しかし、それはトラップですか?どのように私は多くの結合で巨大な選択を貼り付けてコピーしないでいくつかのインナーはちょうどテーブル名と列名をこことそこに変更することを選択? – Belun

+1

動的SQLにはありますが、a)デバッグが難しく、b)維持が難しく、c)SQL構文のエラーが実行時にしか見つからないため、それを避ける傾向があります。他のものと同様に、それはツールであり、それは場所ですが、上記のTonyのように、実際に使用する必要があるかどうかを慎重に検討する必要があります。おそらく、あなたは後になっているロジックをカプセル化したビューや、実際には動的SQLを必要とするビューのセットを取り除くことができます。あなたの質問には、私たちが言うべき十分な情報がありません。 – Boneist

答えて

1

動的SQLは、表関数、オブジェクト・リレーショナル・タイプ、データ・カートリッジ、ANYタイプなどの高度なPL/SQL機能よりも一般的に優れています。いくつかの簡単なヒントを使用して、動的SQLの落とし穴を回避し、モジュラーシステムを作成します。

高度なPL/SQL機能はすばらしく、ある時点では少なくとも少しは使用する必要があります。彼らは奇妙で具体的な問題を解決するのに最適です。しかし、これらの機能の1つを中心としたOracleシステムの作成は、ほぼ間違いなく後悔します。上記のPL/SQL機能のそれぞれで、数週間または数ヶ月の人生を無駄にしました。

動的SQL

プロ - それは常に動作します。痛いかもしれませんが、が常にになり、SQLで動作させて高速化させる方法です。

Con - 読み書きが少し難しい。

高度なPL/SQL

プロ - クールな機能、完全に特定の問題を解決することができ、エレガントなコード。

コン - 決定的な瞬間であなたを失望させます。

それは小説を書くことなく、高度なPL/SQLの失敗の例を与えることは難しいです。ストーリーは、通常、次のようなものになります。「A、B、Cの機能を組み合わせました... X、Y、Zのバグに遭いました...皆が怒っていました。


動的SQLはそれほど悪くはありません。それはちょうどいくつかの規律が必要です。

  1. 良好な書式設定と計測。は、動的SQLが美しく見えると、それは簡単にデバッグのためにプリントアウトすることができることを確認してください。良いプログラミングプラクティスに従ってください - インデント、コメントを追加し、意味のある名前を使用する、などIDE上の「Beautifier」ボタンがそれらを助けない場合、ポイント・アンド・クリック・プログラマーにとっては衝撃的です。技術的には文字列であるため誰も共通のスタイルルールを避けてはならないという理由だけで、コードが邪魔にならないようにしてください。

  2. 代替の引用メカニズム。常に逃げないようにするには、qの構文を使用してください。たとえば、'I''ll use single quotes if I want to!'の代わりにq'[I'll use single quotes if I want to!]'とします。

  3. 連結の代わりにテンプレート。中断されていないブロックにコードを書き込み、後で動的部分を置き換えます。コード内に100万の引用符とパイプがないように、文字列をqと組み合わせてください。たとえば:

    v_dynamic_sql_template constant varchar2(32767) := 
    q'[ 
        select a, b, $DYNAMIC_SELECT_LIST$ 
        from table1 
        $DYNAMIC_JOIN_1$ 
        where table1.a > 1 
         $DYNAMIC_WHERE_1$ 
    ]'; 
    
    ... 
    
    v_dyanmic_sql := replace(v_dynamic_sql_template, '$DYNAMIC_SELECT_LIST$', v_variable); 
    
    ... 
    

は(この質問では、私はあなたが中級、上級のOracle開発者であると仮定し、あなたが初心者であれば、答えはおそらく、静的SQLステートメントですが、あなたは十分 を見ていません。 SQLの機能はそれを実現するものです)。

+0

私は中間レベルです、はい。私はすでにテーブル関数とオブジェクト(これまでのデータだけで構成や継承はあまりありません)を使用し始めましたが、私はオブジェクトを強化する必要があるのだろうか(時間がかかり、私のオブジェクトとテーブル関数を削除し、動的SQLと一緒に行く。正直言って、このテンプレートのアイデアは、動的SQLでは非常にクールです。私は読みやすさを失いたくないからです – Belun

関連する問題