私の好みは、変数を宣言するために、常に %ROWTYPE を使用するか、できればカーソル FOR ループを使用することです。Back In The Day (tm) では、メモリの使用について多くのことを心配していました。そのため、個々のフィールドを宣言することで、数バイト節約できれば意味があるかもしれません。しかし、最近では、IMO では、ギガバイト単位で測定されたメモリ スペースがある場合、コードの複雑さの増大は、数バイトの節約の価値を上回ります。実行速度に関する限り - ああ、お願いします。私たちは、最も一般的な言語のいくつかが仮想マシンの下で実行される世界にいます。私は何時間もかけてアセンブラを手動で最適化し、タイトなループから最後のおかしなサイクルを絞り出しました。Javaは私を笑わせます。VM の下でソフトウェアを実行している場合、「書き込むサイクルが多すぎます!」ということになります。
各問題に対処するには:
私は、ほぼすべての操作にカーソル 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 桁のメガヘルツで測定されている荒野にいると思います。これは当てはまらないかもしれませんが、私がいる場所では(そして、私を信じてください、それは最先端ではありません)、それは十分な戦略です.
上記のルール #1 が主な理由で、SELECT またはカーソルの結果を保持するためのスタンドアロン変数を作成することはめったにありません。
オビ=ワンの言葉を正しく引用すると、「カーソルの 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;
繰り返しになりますが、機能する可能性のある最も単純なものです。シンプルなほどよい。
:-)
共有してお楽しみください。