Мы используем очень старую систему на работе, чтобы управлять наиболее важными частями бизнеса … У меня нет выбора в этом вопросе.
В результате мне удалось заставить драйвер pdo php работать с драйвером базы данных iSeriesAccess, и что касается выбора и вставки, он работает достаточно хорошо с несколькими оговорками, которые не стоит упоминать.
Используя этот код, я не могу получить хранимую процедуру, которая выводится на параметр OUT для выполнения из-за ошибки, которую мне еще предстоит решить.
$proc = $this->link->prepare("CALL QGPL.PROCNAMEHERE(\"*STRANGEPARAMNAMEHERE\",@output,' ')");
$proc->execute();
$proc->closeCursor();
$output = $this->link->query("select @output")->fetch(PDO::FETCH_ASSOC);
var_dump($output);
Полученная ошибка:
Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 0 [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0206 - Column or global variable @OUTPUT not found.
Я знаю, что другой человек в нашей компании, который пишет в java, успешно вызывает эту процедуру в своем коде, однако я понимаю, что он, вероятно, использует разные драйверы.
Эта проблема сводит меня с ума, и я пытался вызвать ее вручную в DBeaver, используя объявленную переменную …, что приводит к еще более странным ошибкам.
Используя как предложено ниже, я получаю
Результаты в
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 0 [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0206 - Column or global variable *RTNORD not found. (SQLPrepare[0] at /build/php5-pO28mL/php5-5.5.9+dfsg/ext/pdo_odbc/odbc_driver.c:206)'
Похоже, вы пытаетесь использовать Переменные сессии MySQL в вашем коде, который не будет работать на DB2.
Я бы посмотрел на PDO bindParam, особенно примеры 2 и 3. Как-то так должно работать:
$bufsize = 100; // Adjust according to how big the output can be
$proc = $this->link->prepare("CALL QGPL.PROCNAMEHERE('*STRANGEPARAMNAMEHERE', ?,' ')");
$proc->bindParam(1, $output, PDO::PARAM_STR|PDO::PARAM_OUTPUT, $bufsize);
$proc->execute();
$proc->closeCursor();
var_dump($output);
Вам может потребоваться создать определение процедуры SQL, если вы просто вызываете программу, иначе вы не сможете подготовить оператор (так как SQL не будет знать, как определяются параметры). Увидеть этот раздел Справочника IBM i по SQL, например.
CREATE OR REPLACE PROCEDURE QGPL.PROCNAMEHERE(IN C CHAR(20), OUT D CHAR(100))
LANGUAGE CL
PARAMETER STYLE GENERAL
EXTERNAL NAME 'QGPL/PROCNAMEHERE';
Других решений пока нет …