我正在使用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确认它们已经被转换。
我将切换到使用值而不是参数为特定的行,但它会让我疯狂,直到我弄清楚发生了什么事情。
感谢
乍得
你总是传递四个值吗?你能发布运行该语句的代码吗? –