вызов программы RPGLE из SQL в PHP/Zend Framework

У нас есть программа AS400 RPGLE, созданная в библиотеке LMTLIB, которая называется ARTEST.

Он имеет один числовой входной параметр, который просто возвращает 2.

$myVar = "1";

$db = Zend_Registry::get('config')->resources->multidb->as400;

$abstractAdapter = new Zend_Db_Adapter_Db2($db);

//Gives the message "Invalid bind-variable position 'myVar'"
$sql = 'CALL QSYS.QCMDEXC(\'CALL LMTLIB.ARTEST PARM(?)\', 0000000026.00000)';

//Gives the message "Token PARM was not valid. Valid tokens: ( INTO USING. SQLCODE=-104"    
$sql = 'CALL LMTLIB.ARTEST PARM(?)';

//Gives the message "ARTEST in LMTLIB type *N not found. SQLCODE=-204"
$sql = 'CALL LMTLIB.ARTEST (?)';

$stmt = new Zend_Db_Statement_Db2($abstractAdapter, $sql);

$stmt->bindParam('myVar', $myVar, 4, 1);

$stmt->execute();

Теперь я могу понять, почему третья инструкция SQL завершится ошибкой с сообщением «не найдено»… потому что это не таблица/файл, а скорее программа RPGLE.

Раздражает то, что если я удалю (?) и просто вставлю (1)... вызов SQL окажется успешным, и программа RPGLE покажет, что он был вызван. Однако тогда я не могу увидеть, каков был ответ программы.

Заранее благодарю за любую помощь!


person adam    schedule 02.05.2012    source источник


Ответы (2)


Как правило, менеджер баз данных использует оператор CALL для вызова хранимой процедуры. Когда он это делает, он ищет хранимый процесс, сигнатура параметра которого совпадает с сигнатурой CALL.

Если хранимой процедуры с таким именем и подписью нет, менеджер базы данных пытается вызвать программу. Опять же, происходит процесс сопоставления параметров.

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/db2/rbafzmstcallsta.htm

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

person Buck Calabro    schedule 02.05.2012
comment
Похоже, это работает с Zend. Только один совет: когда я работал с php и odbc на db2/400, мне пришлось узнать, что php_odbc не поддерживает выходные параметры. - person kratenko; 11.05.2012

IBM RPGLE может взаимодействовать с инфраструктурой Zend через вызовы веб-сервисов.

Скотт Клемент описывает некоторые основы этого здесь.

В зависимости от вашего приложения это может быть лучший способ взаимодействия с кодом RPG. Веб-сервисы можно настроить так, чтобы они вызывали множество программ RPG и таблиц iSeries и возвращали обслуживаемый набор результатов. Zend увидит это так же, как и любой другой вызов RESTful, который может быть обработан вашими моделями.

person Nicholas DeLessio    schedule 21.02.2018