2017-03-26 52 views
1

私は、従業員の古いレコードに基づいて従業員の新しいレコードを再投入するプログラムを構築しています。 サンプルのコンセプトの一例: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; 

を使用していますか?

+0

ほとんどの場合、 'CURSOR'を使用する最良の方法は、それを使用しないことです...わかりませんが、このSPは何をしていますか? - ほとんどの場合、セットベースのアプローチは優れています... – Shnugo

+0

問題のSPは、現実のシナリオでは、Oracle EBS Seeded APIのダミーSPです。 「セットベース」のアプローチはどういう意味ですか? –

答えて

1

カーソルoverloadingを実行しようとしていますが、これによりメモリ容量が節約され、コードの一貫性が保たれ、可読性が向上します。 Overloadingを使用したことにより、パフォーマンスが大幅に向上しました。NOです。

「オーバーロード」のプロセスは、多態性の概念を持つオブジェクト指向のコーディングの世界に由来します。 PL/SQLストアド・プロシージャまたはファンクションの機能は、入力データ型に基づいて変更できます。

Tomによると、過負荷の唯一の利点は「使い易さ」です。

+0

PL/SQLでの関数のオーバーロードの概念は、カーソルにも適用されますか? –

+1

'オーバーロード 'は、手続き/関数/カーソルなどに適用できる概念です。 – XING

関連する問題