我正在使用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確認它們已經被轉換。
我將切換到使用值而不是參數爲特定的行,但它會讓我瘋狂,直到我弄清楚發生了什麼事情。
感謝
乍得
你總是傳遞四個值嗎?你能發佈運行該語句的代碼嗎? –