从存储过程调用返回变量作为变量的输出值

Posted

技术标签:

【中文标题】从存储过程调用返回变量作为变量的输出值【英文标题】:Return variable from stored procedure call as output value for variable 【发布时间】:2019-02-06 20:14:37 【问题描述】:

我目前正在运行一个存储过程,它运行成功,但在调用一个单独的过程之后,我想返回 V_R_ID 的值作为输出值,以存储在 php

所以在这个例子中:

P1 : BEGIN ATOMIC

DECLARE V_H_ID INTEGER DEFAULT 0 ;
DECLARE V_R_ID VARCHAR ( 20 ) ;
DECLARE V_TIMESTAMP TIMESTAMP ;

DECLARE C_NAME VARCHAR ( 45 ) DEFAULT 'EMAIL' ;

SELECT CAST ( NEXT VALUE FOR SCHEMA . H_ID_SEQUENCE AS VARCHAR ( 20 ) )
INTO V_R_ID
FROM SYSIBM . SYSDUMMY1 ;

CALL PROCEDURESCHEMA . INSERT_TYPE ( 
V_R_ID
, C_NAME
, IN_DATA
, NULL
, NULL ) ;

/*Here I'd like to declare V_R_ID as an output of RETURN_ID */

END P1 

如何正确执行此操作,以便在 PHP 中调用此过程后,我可以将 RETURN_ID 设置为 php 变量 $returnID

【问题讨论】:

【参考方案1】:

考虑声明一个来自DB2 docs的输出参数:

仅输出参数,将值从存储过程返回给调用程序。

CREATE PROCEDURE myProc (OUT V_R_ID  VARCHAR (20))

   LANGUAGE SQL 

P1 : BEGIN ATOMIC

   DECLARE V_H_ID INTEGER DEFAULT 0 ;
   DECLARE V_R_ID VARCHAR ( 20 ) ;
   DECLARE V_TIMESTAMP TIMESTAMP ;

   DECLARE C_NAME VARCHAR ( 45 ) DEFAULT 'EMAIL' ;

   SELECT CAST ( NEXT VALUE FOR SCHEMA . H_ID_SEQUENCE AS VARCHAR ( 20 ) )
   INTO V_R_ID
   FROM SYSIBM . SYSDUMMY1 ;

   CALL PROCEDURESCHEMA . INSERT_TYPE ( 
      V_R_ID
    , C_NAME
    , IN_DATA
    , NULL
    , NULL ) ;

END P1 

然后在 PHP 中,使用 PDO prepared statement,调用带有 ? 占位符的过程并将其绑定到 PHP 变量:

$dbh = new PDO("ibm:DRIVER=IBM DB2 ODBC DRIVER;DATABASE=****;" .
               "HOSTNAME=##.##.##.###;PORT=####;PROTOCOL=TCPIP;", "user", "pass");

$stmt = $dbh->prepare("CALL myProc(?)"); 
$stmt->bindParam(1, $return_id, PDO::PARAM_STR, 20); 
$stmt->execute();

echo $return_id;

类似但略有不同,使用 PHP 的 IBM DB2 module 连接绑定参数到变量的字符串名称:

$conn = db2_connect($database, $user, $password);

$stmt = db2_prepare($conn, "CALL myProc(?)");
db2_bind_param($stmt, 1, "return_id", DB2_PARAM_OUT);
db2_execute($stmt);

echo $return_id;

【讨论】:

非常感谢,这很有道理,我会尽快尝试 如果我在 pdo 中使用输入调用它,我必须绑定这些并将其作为输出参数调用,对吗? 是的,为每个需要的对应输入或输出参数添加bindParam 行匹配? 占位符。 因此,它不允许将其作为输出参数,因为它不是唯一的,所以我将其设为 OUT_V_R_ID。那应该仍然按预期工作吧?我无法在 IDE 中运行它并返回 ID

以上是关于从存储过程调用返回变量作为变量的输出值的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL存储过程 - 无法将输出值分配给变量

从子查询存储过程分配变量

九MySQL存储过程和函数

ORACLE存储过程里可以声明过程和函数吗

oracle-游标-存储过程-函数-包

oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,