0

コード 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番目の出力は正しいです。何が理由でしょうか?何か案が?バインド変数のデータ型は以下の通りです。

  1. ユーザー ID varchar2、入力
  2. ノード ID、プロシージャ ID、番号 (10)
  3. アドレス 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;
4

2 に答える 2

0

私が懸念しているのは、この行です。

V_STR_SQL2 := replace(V_STR_SQL2,':V_ADDRESSE',V_ADDRESSE);

VARCHAR2これにより、変数の内容がV_ADDRESSE引用符なしでクエリに直接配置されます。

V_STR_SQL2デバッグ中に取得した値を考えると、の値はV_ADDRESSE有効なSQL式である必要があります。その値がのようなものである1 High Street場合、あなたは次のようなV_STR_SQL2ものを含むことになります

AND DCL_USER_NAME = 1 High Street

これは有効なSQLではありません。これを実行しようとするとエラーが発生します。

では、何をV_ADDRESSE含めることができますか?2つの可能性が私に示唆しています。

  • 変数の値には、のように両端にがV_ADDRESSE含まれます。''1 High Street'
  • 変数の値に次のV_ADDRESSEような文字列が含まれており、00012493これを値と一致させる必要があります12493

正確には何がV_ADDRESSE含まれていますか?

于 2012-07-29T10:08:58.817 に答える
0

以下をお試しください

EXECUTE IMMEDIATE V_STR_SQL2
INTO P_REC_CNT
USING  V_USER_ID,V_USER_ID,V_NODEID,V_PROCID, V_ADDRESSE;

以下のリンクは、その理由をより理解するのに役立ちます

動的 SQL ステートメント

于 2012-07-29T09:14:43.637 に答える