0

値を取得し、後で挿入ステートメントを介して保存する次の2つの方法を検討しています。つまり、Pl/SQLカーソルまたは直接SQLを使用します。どちらのアプローチにも利点はありますか?または、より効率的なアプローチはありますか?

アプローチ1

Cursor system_date
Is 
 select sysdate from dual;
system_date_rec system_date%type;

Open system_Date;
Fetch system_date into system_date_rec;

Insert into table(dateValue)
values(system_date_rec.date);

アプローチ2

dateString  varchar(20);
Select sysdate into dateString from dual;
Insert into table(dateValue)
values(dateString);
4

3 に答える 3

6

アプローチ3はどうですか。

Insert into table(dateValue)
values(sysdate);

または、データを取得するために実際に選択を行う必要があったと仮定します。

Insert into table(dateValue)
select dateValue from other_table where ...;

どちらか一方が必要な場合に明示カーソルまたはSELECTINTOのどちらが望ましいかについては、クエリが正確に1行を返すことが期待される場合は、より適切で安全なSELECTINTOを選択します。

select some_value
into l_var
from other_table
where ...;

if l_var = 'A' then
  do_something;
end if;

返される行数が期待どおりでない場合、例外(NO_DATA_FOUNDまたはTOO_MANY_ROWS)が発生します。カーソルを使用すると、l_varが変更されないか、最初に一致する行の値に設定されます。これは、おそらくyuにバグがあるが、それがわからないことを意味します。

于 2010-11-17T17:02:06.400 に答える
2

それぞれのアプローチにはメリットがありますが、取得する値が1つしかない場合はselect ... into ...、これがはるかに簡単で、値が1つしかないことを確認するために使用します。

トニーのアプローチは、適切な状況では両方よりもおそらく好ましいですが。

値も戻したい場合は、常にRETURNING挿入ステートメントの句があります。

my_date_value date;
...
INSERT into table(datevalue)
values (sysdate)
returning sysdate into my_date_value;
于 2010-11-17T17:13:08.520 に答える
1

私は@Tonyと@MikeyByCrikeyに同意します。これselect ... intoは、特に、個人的な主観的な意見では、宣言セクションで選択が見えないようにするのではなく、選択と統合を維持するためです。単純な場合は実際には問題ではありませんが、いくつかの大きなクエリと操作を実行していることを示唆しています。これは、手順が長くなることを意味します。

少しトピックから外れていますが、すべての操作が最後に単一の挿入のデータを収集することである場合は、多数の個別の変数を使用するのではなく、単一の変数を行タイプとして宣言し、必要に応じて列を更新することを検討します。

declare
    l_row my_table%ROWTYPE;
begin
    select ... into l_row.column1;
    select ... into l_row.column2;
    if l_row.column2 = 'A' then
        /* do something */
    end if;
    l_row.column3 := 'somevalue';
    fetch ... into l_row.column4;
    /* etc */
    insert into my_table values l_row;
end;
于 2010-11-17T17:55:27.757 に答える