Я выполняю следующий запрос, используя 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 возвращает две ошибки: Описать параметр Failed и Binding Error .
Я сузил проблему до этой строки: CL.SLS_CTR_CD IN (?,?,?,?)
. Если я использую здесь фактические значения вместо параметров, запрос выполняется нормально.
Окружающая среда Zend Server для IBM i, PHP 5.3, DB2 (on i) V6R1. Единственная помощь, которую я получаю из журнала заданий (QEZJOBLOG), – это SQL0313 (количество переменных хоста недействительно).
Опять же, я подтвердил, что предоставляю правильное количество переменных. Ошибка « Описать параметр с ошибкой» заставляет меня задаться вопросом, пытается ли PHP определить тип этих четырех параметров. Они должны быть string(2)
, а переменная var_dump массива параметров, переданная в db2_execute, подтверждает, что они были представлены как таковые.
Я собираюсь переключиться на использование значений вместо параметров для этой конкретной строки, но это заставит меня сходить с ума, пока не выясню, что происходит.
благодаря
Чад
У меня было несколько проблем с db2_prepare и db2_execute, которые связывают параметры в сложных запросах с этим уровнем 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
проблемы исчезают, и я возвращаюсь к разрешительному сумасшедшему уровню 🙂