2011-09-01 33 views
1

我正在使用PHP的db2_prepare和db2_execute以下查询(架构名称已更改为保护无辜者):db2_execute回报“描述帕拉姆失败”和“绑定错误”

WITH U AS (
      SELECT * 
      FROM FOO.USR 
      WHERE USR_ID = ? 
     ), UC AS (
      SELECT UC.* 
      FROM FOO.USR_CNTRCT UC 
       JOIN U ON U.USR_ID = UC.USR_ID 
     ) , LC AS (
      SELECT DISTINCT CNTRCT_ID 
      FROM FOO.CNTRCT_LOC CL 
       JOIN FOO.USR_LOC UL ON UL.SLS_CTR_CD = CL.SLS_CTR_CD 
       JOIN U ON U.USR_ID = UL.USR_ID 
      WHERE CL.SLS_CTR_CD IN (?,?,?,?) 
     ) 
    SELECT C.*, COALESCE(P.PGM_NM, CAST('' AS CHAR(80) CCSID 37)) AS PGM_NM, 
     COALESCE(ADT.ACTN_TM, TIMESTAMP('2000001', '00.00.00')) AS TIME_ORDER 
    FROM U, FOO.CNTRCT AS C 
     LEFT JOIN FOO.CNTRCT_PGM CP ON CP.CNTRCT_ID = C.CNTRCT_ID 
     LEFT JOIN FOO.PGM P ON P.PGM_ID = CP.PGM_ID 
     LEFT JOIN UC ON UC.CNTRCT_ID = C.CNTRCT_ID 
     LEFT JOIN (
      SELECT ENTY_ID AS CNTRCT_ID, MAX(ACTN_TM) AS ACTN_TM 
      FROM FOO.ADT A JOIN U ON U.USR_ID = A.USR_ID 
      WHERE ENTY_TP = 'CT' 
      GROUP BY ENTY_ID 
     ) AS ADT ON ADT.CNTRCT_ID = C.CNTRCT_ID 
    WHERE C.APP = ? 
      AND (
       ((SELECT COUNT(*) FROM UC) > 0 AND UC.CNTRCT_ID IS NOT NULL) 
       OR 
       ((SELECT COUNT(*) FROM UC) = 0 AND UC.CNTRCT_ID IS NULL) 
      ) 
      AND ? BETWEEN YEAR(STRT_DT) AND YEAR(END_DT) 
      AND (LOWER(CNTRCT_NM) LIKE ?) 
    ORDER BY CNTRCT_NM ASC 

我已确认我的参数在数量和顺序上都是正确的。当我执行这个查询时,php返回两个错误:描述参数失败绑定错误

我把问题缩小到这一行:CL.SLS_CTR_CD IN (?,?,?,?)。如果我在这里使用实际值而不是参数,查询运行良好。

环境是用于IBM i,PHP 5.3,DB2(在i)V6R1上的Zend Server。我从作业日志(QEZJOBLOG)得到的唯一帮助是SQL0313(主机变量的数量无效)。

再次,我已确认我提供了正确数量的变量。 描述参数失败错误让我怀疑PHP是否在努力确定这四个参数的类型。它们应该是string(2),并且传递给db2_execute的参数数组的var_dump确认它们已经被转换。

我将切换到使用值而不是参数为特定的行,但它会让我疯狂,直到我弄清楚发生了什么事情。

感谢

乍得

+0

你总是传递四个值吗?你能发布运行该语句的代码吗? –

回答

1

我曾与db2_prepare和db2_execute蒙山在复杂的查询绑定PARAMS与此PTF的水平的几个问题:

SF99601 15 DB2 FOR IBM i 
SF99354 8 TCP/IP GROUP PTF 
SF99115 14 IBM HTTP SERVER FOR i 

升级到各级

20 DB2 
11 TCP/IP 
20 IBM HTTP 

这个问题消失了,我又回到了一个可疑的疯狂乐vel :)

+0

优秀信息!我会检查我的操作人员,看看我们是否可以应用ptfs。 –

+0

操作在周末放下了一些PTF,并且我瞧,我的参数化查询现在可以正常工作。再次感谢! –

+0

很高兴听到它:) – corretge