0

我终于明白了 SQL 存储过程和基于 RPG 或任何其他 AS400 对象的外部存储过程之间的区别。现在我尝试添加调用语句来执行外部存储过程,它只有一个 out 参数,由 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 转换成外部存储过程。

角色扮演游戏:

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                                     

测量员/400 的 DDL:

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 没有返回任何内容。

谢谢您的帮助,

4

2 回答 2

1

如果没有可查看的代码,很难判断可能是什么问题。这是我系统中的工作代码。

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 外部存储过程。

于 2015-02-18T21:28:15.290 回答
1

我想我找到了为什么代码不起作用。

如果您使用的是早于 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 Toolkit 的一些调用 DEMO 也不起作用。

http://forums.zend.com/viewtopic.php?f=77&t=115183&p=223528&hilit=external+stored+procedure#p223693

于 2015-02-19T19:59:56.633 回答