コード 1:
OPEN P_CURSOR FOR V_STR_SQL2
USING P_USER_ID, P_USER_ID, V_NODEID, V_PROCID, V_ADDRESSE;
出力: 0,0,0,0
このコードを次のように変更すると:
V_STR_SQL2 := replace(V_STR_SQL2,':P_USER_ID',P_USER_ID);
V_STR_SQL2 := replace(V_STR_SQL2,':V_NODEID',V_NODEID);
V_STR_SQL2 := replace(V_STR_SQL2,':V_PROCID',V_PROCID);
V_STR_SQL2 := replace(V_STR_SQL2,':V_ADDRESSE',V_ADDRESSE);
OPEN P_CURSOR FOR V_STR_SQL2;
出力: 1,0,0,0
2番目の出力は正しいです。何が理由でしょうか?何か案が?バインド変数のデータ型は以下の通りです。
- ユーザー ID varchar2、入力
- ノード ID、プロシージャ ID、番号 (10)
- アドレス varchar2(250);
-- 編集済み
ストアド プロシージャをデバッグすると、これはオープン カーソルを実行する前の v_str_sql2 の値です。sqldeveloper で vlaue を指定してこのクエリを実行すると、正しい結果が得られます。しかし、open-for-use では間違った結果になります。
SELECT COUNT(DECODE(ZC.STATUS, NULL, 1)) "NEW",
COUNT(DECODE(ZC.STATUS, 'KEEP', 1)) "KEEP",
COUNT(DECODE(ZC.STATUS, 'LOCK', 1)) "LOCK",
COUNT(DECODE(ZC.STATUS,
'KEEP',
DECODE(UPPER(ZC.STATUS_BY), UPPER(:P_USER_ID), 1))) "PKEEP",
COUNT(DECODE(ZC.STATUS,
'LOCK',
DECODE(UPPER(ZC.STATUS_BY), UPPER(:P_USER_ID), 1))) "PLOCK"
FROM tab1 PARTITION(DCL_OTHERS) DCL,
tab2 ZC,
tab3 TC
WHERE DCL.NODE_ID = TC.NODE_ID
AND DCL.PROC_ID = TC.PROC_ID
AND DCL.CASE_REF_NO = TC.CLAIM_REF_NO
AND DCL.NODE_ID = ZC.NODE_ID(+)
AND DCL.PROC_ID = ZC.PROC_ID(+)
AND DCL.CASE_NAME = ZC.CASENUM(+)
AND DCL.USER_NAME = ZC.USERNAME(+)
AND DCL.NODE_ID = :V_NODEID
AND (DCL.PROC_ID = :V_PROCID)
AND (1 = 1)
AND DCL.USER_NAME = :V_ADDRESSE
編集 2
私はこの構文を使用しています。この構文に何か問題がありますか?
CREATE OR REPLACE PROCEDURE USP_HTH_QUEUEPAGE(P_QUEUENAME VARCHAR2,
P_CURSOR OUT SYS_REFCURSOR,
P_REC_CNT OUT NUMBER) IS
BEGIN
-- CODE TO GENERATE DYNAMIC SQL
OPEN P_CURSOR FOR V_STR_SQL1
USING V_ADDRESSE, V_NODEID, V_PROCID, V_STATUS, V_USER_ID, P_EP, P_SP;
/*END IF;*/
EXECUTE IMMEDIATE V_STR_SQL2
INTO P_REC_CNT
USING V_NODEID, V_PROCID, V_USER_ID, V_STATUS, V_ADDRESSE;
END;