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