2017-03-20 9 views
0

forループ内で動的テーブル名を使用します。私はカーソルを使用することでこの問題の解決策があることを理解しています。しかし、私の現在のコードは一般的なforループ(暗黙のカーソル)を持っているので、私は明示的なカーソルのために行くことなく同じ方法を保持できるかどうかを知りたかったので、カーソルなしのソリューションがあるのだろうかと思っていた。今私の作品は何カーソルを使用しない動的テーブル名

は次のとおりです。

BEGIN 
for itr in (select var1,var2,var3,var4 from schedule_table) 
loop 
--work using itr.var1, itr.var2, itr.var3, itr.var4 
end loop 
END 

と、とにかく、私は、forループの同じ種類を使用することができますが、動的にそれにテーブル名を渡すがあった場合、私は知りたいです。私は即時の動的SQLオプションを実行する方法を検討しましたが、forループ内で使用できるとは思いません。私は明示的なカーソルを使って作業するための手順全体を再設計する前に、ここでこれをチェックすることを考えました(暗黙のうちにパフォーマンスを恐れるので大きなファンではありません)。

ありがとうございます。

あなたはそれを通じて EXECUTE IMMEDIATE BULK COLLECT INTOに収集・ループを使用することができます
+0

"恐怖"は、ベンチマークの代用品ではありません。行単位のモードで実行している場合、明示的なカーソルを管理するオーバーヘッドが最小限に抑えられるようです。 – APC

答えて

1

をオラクル12C

DECLARE 
    TYPE t_rec IS RECORD(fname VARCHAR2(100), lname VARCHAR2(100)); 
    TYPE t_tab IS TABLE OF t_rec; 
    t t_tab; 
    v_table_name VARCHAR2(128) := 'HR.EMPLOYEES'; 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT first_name, last_name FROM ' || v_table_name 
    BULK COLLECT INTO t; 

    FOR i IN 1 .. t.COUNT LOOP 
    DBMS_OUTPUT.PUT_LINE(t(i).fname || ' ' || t(i).lname); 
    END LOOP; 
END; 
/

注意:Oracle 10/11であなたがコレクション型を作成する必要がありますSQLスコープOracle 12では、PL/SQLスコープで宣言できます。

+0

ありがとうございました。この動的SQLソリューションは、明示的なカーソルを使用するよりも高速になると思いますか?私たちが扱っているデータの種類を知るために、3000行と100列(すべてvarchar2(10〜400バイト))の表を行ごとに読み込み、データ値に基づいて計算する必要があります。 – user4923462

+1

LIMIT句を指定した明示的なカーソルを使用すると、メモリ使用量をより適切に制御できるようになるため、そのサイズのテーブルではセッションメモリが大量に消費されます。 – APC

関連する問題