Я выполняю следующий запрос, используя PHP db2_prepare и 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 (?,?,?,?)
,Если я использую здесь фактические значения вместо параметров, запрос выполняется нормально.
Средой является Zend Server для IBM i, PHP 5.3, DB2 (на i) V6R1.Единственная помощь, которую я получаю из журнала заданий (QEZJOBLOG), - это SQL0313 (Число переменных хоста недопустимо).
Опять же, я подтвердил, что предоставляю правильное количество переменных.Ошибка Describe Param Failed заставляет меня задуматься, пытается ли PHP определить тип этих четырех параметров.Они должны быть типа string(2)
, а переменная var_dump массива параметров, передаваемая в db2_execute, подтверждает, что они были преобразованы как таковые.
Я собираюсь перейти к использованию значений вместо параметров для этой конкретной строки, но это сводит меня с ума, пока я не выясню, что происходит.
Спасибо
Чад