db2_execute возвращает «Describe Param Failed» и «Ошибка привязки» - PullRequest
1 голос
/ 02 сентября 2011

Я выполняю следующий запрос, используя 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, подтверждает, что они были преобразованы как таковые.

Я собираюсь перейти к использованию значений вместо параметров для этой конкретной строки, но это сводит меня с ума, пока я не выясню, что происходит.

Спасибо

Чад

1 Ответ

1 голос
/ 02 сентября 2011

У меня было несколько проблем с 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

проблемы исчезают, и я возвращаюсь к всепоглощающему безумному уровню:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...