アプリ版:「スタンプのみでお礼する」機能のリリースについて

CURSORを使用する際に、以下のようなことが実現できるものか分からないもので、
ご質問させていただきました。

以下のような記述で、where条件を別の変数(wk_where)に格納しておいて、
それを連結させることが可能なのかお教えいただきたいです。
もしも可能であればどのように連結させるのでしょうか?

CURSORcur出力データIS
SELECT
AAA,
BBB
FROM
AAAテーブル
;

イメージとしては以下のように考えていました。
CURSORcur出力データIS
SELECT
AAA,
BBB
FROM
AAAテーブル & wk_where
;


以上ですが、宜しくおねがいいたします。

A 回答 (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/b …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!