私は、従業員の古いレコードに基づいて従業員の新しいレコードを再投入するプログラムを構築しています。 サンプルのコンセプトの一例:x_table
に従業員の記録が保存されています。 ID
のレコードは最初のレコード、2は新しいレコードです。PL/SQLでカーソルを再利用するベストプラクティス
create x_table
(
id number,
value varchar2(100)
);
insert into x_table (id, value) values (1, 'One');
insert into x_table (id, value) values (2, 'Two');
commit;
サンプルダミーパッケージ・プロシージャthis_is_a_pkg.do_something
は彼の彼女のレコードを更新します。
(これは明示カーソルx_cur
(下記)を再利用する最良の方法です)
異なる明示カーソルと複数の型宣言
declare
cursor x_cur (p_id number) is
select *
from x_table;
cursor x_cur2 (p_id number) is
select *
from x_table;
type x_type is table of x_cur%rowtype index by pls_integer;
x_rec x_type;
x_rec2 x_cur2;
begin
open x_cur(1);
fetch x_cur
into x_rec;
close x_cur;
open x_cur(2);
fetch x_cur
into x_rec2;
close x_cur;
for i in 1..x_rec2 loop -- outer loop because this is the new record
for x in 1..x_rec loop -- outer loop because this is the old record
this_is_a_pkg.do_something(p_new_id => x_rec2(i).id
p_old_value => x_rec(x).value)
end loop;
end loop;
end;
思考を使用して、同じ明示カーソルが、複数の型宣言
declare
cursor x_cur (p_id number) is
select *
from x_table;
type x_type is table of x_cur%rowtype index by pls_integer;
x_rec x_type;
x_rec2 x_type;
begin
open x_cur(1);
fetch x_cur
bulk collect
into x_rec;
close x_cur;
open x_cur(2);
fetch x_cur
bulk collect
into x_rec2;
close x_cur;
for i in 1..x_rec2 loop -- outer loop because this is the new record
for x in 1..x_rec loop -- outer loop because this is the old record
this_is_a_pkg.do_something(p_new_id => x_rec2(i).id
p_old_value => x_rec(x).value)
end loop;
end loop;
end;
を使用していますか?
ほとんどの場合、 'CURSOR'を使用する最良の方法は、それを使用しないことです...わかりませんが、このSPは何をしていますか? - ほとんどの場合、セットベースのアプローチは優れています... – Shnugo
問題のSPは、現実のシナリオでは、Oracle EBS Seeded APIのダミーSPです。 「セットベース」のアプローチはどういう意味ですか? –