- ベストアンサー
PL/SQLでのCURSORの記述について
- PL/SQLでのCURSORの使用方法についてご質問いただきました。
- 特定の条件を別の変数に格納して連結する方法についてお教えください。
- 具体的なイメージとして、カーソルのSELECT文にwhere条件を連結する方法についての質問です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
検索条件となる項目は決まっていて値のみを変えたい、というのであればカーソルにパラメータを渡すようにすれば可能です。 検索条件まるごと動的に変えたい、ということであれば明示カーソルでは出来ないと思いますが、動的SQLを使えば可能です。 以下、参考になれば。 DROP TABLE TEST_TAB PURGE; CREATE TABLE TEST_TAB AS SELECT 1 COL1, 100 COL2 FROM DUAL UNION ALL SELECT 1 COL1, 101 COL2 FROM DUAL UNION ALL SELECT 2 COL1, 200 COL2 FROM DUAL UNION ALL SELECT 2 COL1, 201 COL2 FROM DUAL UNION ALL SELECT 2 COL1, 202 COL2 FROM DUAL UNION ALL SELECT 3 COL1, 300 COL3 FROM DUAL UNION ALL SELECT 3 COL1, 301 COL3 FROM DUAL UNION ALL SELECT 3 COL1, 302 COL3 FROM DUAL UNION ALL SELECT 3 COL1, 303 COL3 FROM DUAL; SET SERVEROUTPUT ON DECLARE --カーソルにパラメータを渡せるように定義 CURSOR C1(I_COL1 TEST_TAB.COL1%TYPE) IS SELECT * FROM TEST_TAB WHERE COL1 = I_COL1; --パラメータを検索条件に使用 --カーソル変数 W_RCUR_TEST_TAB SYS_REFCURSOR; --レコード変数 W_REC_TEST_TAB TEST_TAB%ROWTYPE; --基本となるSQL C_SQL CONSTANT VARCHAR2(100) := 'select * from TEST_TAB'; --WHERE句 W_WHERE VARCHAR2(100); BEGIN --パラメータを設定してカーソルオープン FOR R1 IN C1(1) LOOP DBMS_OUTPUT.PUT_LINE(R1.COL2); --100, 101 END LOOP; FOR R1 IN C1(2) LOOP DBMS_OUTPUT.PUT_LINE(R1.COL2); --200, 201, 202 END LOOP; --WEHRE句部分を生成 W_WHERE := ' where col1 = 3'; --動的SQLのカーソルオープン OPEN W_RCUR_TEST_TAB FOR C_SQL || W_WHERE; LOOP --1行分のデータをフェッチ FETCH W_RCUR_TEST_TAB INTO W_REC_TEST_TAB; --データがなくなったら終了 EXIT WHEN W_RCUR_TEST_TAB%NOTFOUND; DBMS_OUTPUT.PUT_LINE(W_REC_TEST_TAB.COL2); --300, 301, 302, 303 END LOOP; CLOSE W_RCUR_TEST_TAB; END; / SET SERVEROUTPUT OFF 詳しくはORACLEのリファレンスを参照してください。 http://docs.oracle.com/cd/E16338_01/appdev.112/b56260/toc.htm