2012-07-23 38 views
0

代码1:Oracle游标开放换使用给出错误的结果

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

第二个输出是正确的。可能是什么原因?任何想法?数据类型的绑定变量如下所示: 。

  1. 的userid VARCHAR2,输入
  2. NODEID,PROCID,编号(10)
  3. 地址VARCHAR2(250);

- 编辑

当调试我的存储过程,这是v_str_sql2的执行开放光标前的值。当我通过在sqldeveloper中给它的vlaue运行这个查询时,它给了我正确的结果。但错误的结果与开放使用。

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; 
+2

不知道你的查询是什么,两个代码片段之间的关系,关于你的数据的任何东西,任何想法输出代表等等,这很难推测。如果您发布SQL语句,我们至少可以使用一些东西。如果你发布了一个简单的测试用例,我们可以在我们的机器上运行,你几乎肯定会得到答案。 – 2012-07-23 08:10:43

+0

感谢贾斯汀的回复。我编辑了我的帖子。 – Akie 2012-07-23 08:18:07

+0

嗨贾斯汀洞穴..任何意见?让我知道你是否需要任何其他信息。 – Akie 2012-07-23 09:25:06

回答

0

请尝试以下

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

下面的链接会给你更多的想法,为什么

Dynamic SQL Statement

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包含什么?两种可能性表明自己对我说:

  • 您的变量V_ADDRESSE的值包含'在两端,如'1 High Street'
  • 变量V_ADDRESSE的值包含一个字符串,如00012493,并且您希望它匹配值12493

V_ADDRESSE包含什么?