如何从 PHP 调用 IBM 外部存储过程
How to call IBM External Stored Procedure from PHP
我终于明白了 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 Programmer给了我代码,她说她用Surveyor/400转换成External Stored Procedure
角色扮演游戏:
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”,但没有 $RTRFLD returns。
感谢您的帮助,
如果不查看代码,很难判断可能是什么问题。这是我系统的工作代码。
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
角色扮演游戏:
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 程序,而是调用调用 RPG 程序的 SQL 外部存储过程。
我想我找到了代码不起作用的原因。
如果您使用的是早于 ZEND Server 7 或 6.3 的版本,则需要进行修复才能使其正常工作。(请查看 Zend 论坛:http://forums.zend.com/viewtopic.php?f=77&t=115183&p=223528&hilit=external+stored+procedure#p223693)
目前我们仍在使用 Zend Server 6.3.0 免费版,看起来修复不包括在内。所以很明显,XML 工具包中的一些调用 DEMO 也不起作用。
http://forums.zend.com/viewtopic.php?f=77&t=115183&p=223528&hilit=external+stored+procedure#p223693
我终于明白了 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 Programmer给了我代码,她说她用Surveyor/400转换成External Stored Procedure
角色扮演游戏:
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”,但没有 $RTRFLD returns。
感谢您的帮助,
如果不查看代码,很难判断可能是什么问题。这是我系统的工作代码。
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
角色扮演游戏:
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 程序,而是调用调用 RPG 程序的 SQL 外部存储过程。
我想我找到了代码不起作用的原因。
如果您使用的是早于 ZEND Server 7 或 6.3 的版本,则需要进行修复才能使其正常工作。(请查看 Zend 论坛:http://forums.zend.com/viewtopic.php?f=77&t=115183&p=223528&hilit=external+stored+procedure#p223693) 目前我们仍在使用 Zend Server 6.3.0 免费版,看起来修复不包括在内。所以很明显,XML 工具包中的一些调用 DEMO 也不起作用。
http://forums.zend.com/viewtopic.php?f=77&t=115183&p=223528&hilit=external+stored+procedure#p223693