0
  1. 約 15 列のテーブルがあり、myTable約 5 列だけを選択したい場合、rec myTable%ROWTYPE(10 列はまったく使用されません) または単に を作成し、5 列すべてのTYPE rec...ようにフィールドを手動で作成する価値がありますか? (col1 myTable.col1%TYPE...)?

  2. 通常、手動タイプと行タイプをどの程度作成しますか?

  3. 結合を含む SELECT クエリの行タイプを宣言するにはどうすればよいですか? たとえば、rec tableA%ROWTYPE+ おそらく別のフィールドまたは 2 つのフィールドtableBがすべて 1 つのレコード タイプに含まれていますか? 手動で作成しますか? (PLSQLに「拡張」またはレコード継承のようなものがある場合のみ。

長い質問で申し訳ありませんが、意味があることを願っています。前もって感謝します。

4

2 に答える 2

2

私の好みは、変数を宣言するために、常に %ROWTYPE を使用するか、できればカーソル FOR ループを使用することです。Back In The Day (tm) では、メモリの使用について多くのことを心配していました。そのため、個々のフィールドを宣言することで、数バイト節約できれば意味があるかもしれません。しかし、最近では、IMO では、ギガバイト単位で測定されたメモリ スペースがある場合、コードの複雑さの増大は、数バイトの節約の価値を上回ります。実行速度に関する限り - ああ、お願いします。私たちは、最も一般的な言語のいくつかが仮想マシンの下で実行される世界にいます。私は何時間もかけてアセンブラを手動で最適化し、タイトなループから最後のおかしなサイクルを絞り出しました。Javaは私を笑わせます。VM の下でソフトウェアを実行している場合、「書き込むサイクルが多すぎます!」ということになります。

各問題に対処するには:

  1. 私は、ほぼすべての操作にカーソル FOR ループを使用することを好みます。これは、Cunningham の質問 - 「機能する可能性のある最も単純なものは何ですか?」に答えようとする試みの一部です。行タイプ変数を使用する IMO は、最も単純なものです。それらを使用すると、 NO_DATA_FOUND および TOO_MANY_ROWS 例外を明示的に処理する必要がなくなります。

    FOR aRow IN (SELECT col1, col2, col3
                   FROM myTable
                   WHERE some_col = some_value)
    LOOP
      NULL;  -- do something useful here
    END LOOP;
    

    以上

    DECLARE
      var1  myTable.COL1%TYPE;
      var2  myTable.COL2%TYPE;
      var3  myTable.COL3%TYPE;
    BEGIN
      SELECT col1, col2, col3
        INTO var1, var2, var3
        FROM myTable
        WHERE some_col = some_value;
    
      NULL;  -- do something useful here
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        NULL;  -- do something appropriate here
      WHEN TOO_MANY_ROWS THEN
        NULL;  -- do something appropriate here
    END;
    

    それsome_colがユニークであることを私が知っていたとしても - 主に私が働いている場所では、今日ユニークであるものは、私が存在すら知らないチームの開発者の気まぐれで、明日は非ユニークになる可能性があるためです。これは「防御的プログラミング」と呼ばれるもので、午前 2 時に呼び出されないようにすれば、私はハッピー キャンパーです。

    これを行うと、絶対に必要でない場合でもカーソルを開くオーバーヘッドが必要になると、誰かが不満を言うでしょう。何年にもわたるプログラミングの中で、これを行うとプログラムが非常に遅くなり、スタンドアロンのシングルトン SELECT を使用するようにコードを書き直さなければならないという状況に遭遇したことはありません。デジタル ジャングルの暗い深みのどこかで、クロック速度がまだ 1 桁のメガヘルツで測定されている荒野にいると思います。これは当てはまらないかもしれませんが、私がいる場所では(そして、私を信じてください、それは最先端ではありません)、それは十分な戦略です.

  2. 上記のルール #1 が主な理由で、SELECT またはカーソルの結果を保持するためのスタンドアロン変数を作成することはめったにありません。

  3. オビ=ワンの言葉を正しく引用すると、「カーソルの FOR ループを使え、ルーク!」。(まじめな話、彼は本当にそう言った。「強制」的なものはすべて、難聴の映画監督が思いついたがらくたの集まりにすぎない。ふー!)のようなものを書く

    FOR aRow IN (SELECT *
                   FROM table1 t1
                   INNER JOIN table2 t2 on (t2.fieldx = t1.fieldx)
                   INNER JOIN table3 t3 on (t3.fieldy = t2.fieldy))
    LOOP
      NULL;  -- whatever
    END LOOP;
    

    繰り返しになりますが、機能する可能性のある最も単純なものです。シンプルなほどよい。

:-)

共有してお楽しみください。

于 2013-07-16T17:05:53.787 に答える
0

開始するのに適した場所は、次のドキュメントです。

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/overview.htm#sthref159

(『Oracle Database PL/SQLユーザーズ・ガイドおよびリファレンス』)

Steven Feuerstein によって書かれた記事でそれを改善するよりも:

http://www.oracle.com/technetwork/issue-archive/2012/12-may/o32plsql-1578019.html

于 2013-07-16T14:22:26.527 に答える