Zend Framework — Как вызвать внешнюю хранимую процедуру IBM из переполнения стека

Я наконец-то понимаю различия между хранимой процедурой SQL и внешней хранимой процедурой, основанной на RPG или любых других объектах AS400.
Теперь я попытался добавить оператор вызова для выполнения внешней хранимой процедуры, которая имеет только один выходной параметр и генерируется программой RPG, как показано ниже.

PHP:

$server="server";
$user="user";
$pass="pass";
$connect = db2_connect($server,$user,$pass);
$RTVTYP = "D";
$RTRNFLD = "";
$strSql = 'CALL LIB.TEST_SP(?,?)';
$stmt = db2_prepare($connect, $strSql);

db2_bind_param($stmt, 1, "RTVTYP", DB2_PARAM_IN, DB2_CHAR);
db2_bind_param($stmt, 2, "RTRNFLD", DB2_PARAM_OUT, DB2_CHAR);
$result = db2_execute($stmt);

print $result;
print $RTRNFLD;
db2_close($connect);

Программист RPG дал мне код, и она сказала, что использовала Surveyor / 400 для преобразования во внешнюю хранимую процедуру.

RPG:

d rpgprogram        pr
d rtvtyp_                             like(rtvtyp)
d rpgprogram        pi
d rtvtyp                         1

/free
exsr initial;
exsr process;
exec sql set result sets array :web_data for 1 rows;
return;
//***************************************************
begsr process;
select;
when rtvtyp = 'D';
rtrnfld = 'Dog';
when rtvtyp = 'C';
rtrnfld = 'Cat';
other;
rtrnfld = 'Invalid';
endsl;
endsr;
begsr initial;
w1size = %size(m2errds:*all);
p2err = %alloc(w1size);
clear m2errds;
endsr;
/end-free

DDL от Surveyor / 400:

LIB.TEST_SP

General
Procedure: TEST_SP
Maximum number of result sets:1
Data access: MOdifies SQL data
Specific name: TEST_SP

Parameters
RTVTYP Character 1 IN
RTRNFLD Character 10 OUT
Parameter style:
Simple, no null values allowed

External Program
Program: rpgprogram
Schema: LIB
Language: RPGLE

Соединение успешно, $ result возвращается как «1», но ничего не возвращает $ RTRNFLD.

Спасибо за помощь,

0

Решение

Без кода, очень трудно понять, в чем может быть проблема. Вот рабочий код из моей системы.

PHP:

$my_var = "1";
$strSql = 'CALL BUCK.PHPTEST(?)';
$stmt = db2_prepare ( $conn, $strSql );
db2_bind_param($stmt, 1, "my_var", DB2_PARAM_INOUT, DB2_CHAR);
$result = db2_execute ( $stmt );

DDL:

CREATE PROCEDURE buck/phptest(
inout parm_inout varchar (5) ccsid 37)
LANGUAGE RPGLE
NOT DETERMINISTIC
CALLED ON NULL INPUT
EXTERNAL NAME buck/phptest
PARAMETER STYLE GENERAL

RPGLE:

d parm_inout      s              5a   varying

c     *entry        plist
c                   parm                    parm_inout

c/free
parm_inout  = 'Wow';
*inlr = *on;
return;
/end-free

Когда это выполняется на моей тестовой веб-странице, $ result равен ‘1’, а $ my_var — ‘Wow’. Я не вызываю программу RPG напрямую, я вызываю хранимую процедуру SQL External, которая вызывает программу RPG.

0

Другие решения

Я думаю, я нашел, почему код не работает.

Если вы используете более раннюю версию, чем ZEND Server 7 или 6.3, вам нужно иметь исправление, чтобы это работало (пожалуйста, загляните на Zend Forums: http://forums.zend.com/viewtopic.php?f=77&т = 115183&р = 223528&hilit = внешний + хранимая процедура + # p223693)
В настоящее время мы все еще используем Zend Server 6.3.0 Free Edition, и похоже, что это исправление не включено. Очевидно, что некоторые из вызывающих DEMO из XML Toolkit тоже не работают.

http://forums.zend.com/viewtopic.php?f=77&т = 115183&р = 223528&hilit = внешний + хранимая процедура + # p223693

0

По вопросам рекламы [email protected]