2013-08-16 27 views
7

oracleのcursor for loopの使い方を教えてください。Oracleのカーソルforループ

次のコードを使用すると、すべて問題ありません。

for rec in (select id, name from students) loop 
    -- do anything 
end loop; 

しかし、このSQL文の変数を定義しても機能しません。

v_sql := 'select id, name from students'; 

for rec in v_sql loop 
    -- do anything 
end loop; 

エラー:PLS-00103

答えて

10

あなたは

カーソル変数とカーソルを開き、データをフェッチする明示的な方法を使用する必要があなたの問題の第二のアプローチに関連する問題に対処するために。それはないです

FORループ内でカーソル変数を使用することができ

declare 
    l_sql varchar2(123);  -- variable that contains a query 
    l_c sys_refcursor;  -- cursor variable(weak cursor). 
    l_res your_table%rowtype; -- variable containing fetching data 
begin 
    l_sql := 'select * from your_table'; 

    -- Open the cursor and fetching data explicitly 
    -- in the LOOP. 

    open l_c for l_sql; 

    loop 
    fetch l_c into l_res; 
    exit when l_c%notfound; -- Exit the loop if there is nothing to fetch. 

    -- process fetched data 
    end loop; 

    close l_c; -- close the cursor 
end; 

Find out more

+1

最も適切な答えを行うことができます。私は、すべてがより簡単になると思った。あなたの決定に感謝します。 –

5

はこれを試してみてください。

cursor v_sql is 
select id, name from students; 

for rec in v_sql 
loop 
    -- do anything 
end loop; 

その後、不要openfetchまたはcloseカーソルへ。

+0

私は、このコードは、私は定義の段階でSQLコードを知っているが、それは実行段階で生成する場合は動作すると思う。 –

+0

カーソル定義でパラメータを定義できますが、where句に対してのみパラメータを定義できます。テーブルを動的に設定する必要がある場合は、 'OPEN c FOR string'がおそらく行く方法です。 –

0

実行時にクエリを作成する場合は、Refcursorを使用する必要があります。実際にrefcursorsは、取得された行のためのスペースを取らないクエリへのポインタです。 通常のカーソルは機能しません。

declare 
v_sql varchar2(200); 
rec sys_refcursor; 
BEGIN 
v_sql := 'select id, name from students'; 

open rec for v_sql 
loop 
fetch 
exit when.... 
-- do anything 
end loop; 
2

あなたはそのSQL文字列をどこでも実行していません。単純にこの

v_sql := 'select id, name from students'; 
open cur for v_sql; 
for rec in cur loop 
    -- do anything 
end loop; 

を行うか、この

cursor cur is select id, name from students; 
open cur; 
for rec in cur loop 
     -- do anything 
end loop; 

を行うこともできますし、今のところ、この

for rec in (select id, name from students) loop 
    -- do anything 
end loop 
関連する問題