PHP/PDO 在 json 中调用带有输出 CLOB 的过程
PHP/PDO Call procedure with output CLOB in json
当我在 PHP 中使用 PDO 驱动程序调用存储过程时,如何从我的存储过程中获得输出 CLOB?
程序在Oracle中是这样定义的:
PROCEDURE COPI_SCHE(P_ID IN LOCT_SCHE.ID%TYPE,
P_SCHE OUT CLOB)
其中 LOCT_SCHE.ID%TYPE 是 NUMBER (10)
如果我用 TOAD 调用它,它会起作用:
DECLARE
test CLOB;
BEGIN
LOC_SH.COPI_SCHE(884, TEST);
dbms_output.put_line(test);
END
;
输出结果:
{ "ID" : "915", "FK_RA_NO_PERM" : "1234567", "TYPE_SCHE" : "PLP", "DESC_SCHE" : "test 4", "AN" : "", "TIMB_MAJ" : "15-04-10", "USAG_MAJ" : "USER" }
所以,在 PHP 中,我尝试这样做:
$connection = $this->getConnection();
$idGrouping = 884;
$sql = "CALL LOC_SH.COPI_SCHE(?,?)";
$statement = $connection->prepare($sql);
$statement->bindParam(1, $idGrouping, PDO::PARAM_INT);
$statement->bindParam(2, $result, PDO::PARAM_LOB);
$statement->execute();
但是 Oracle 抛出:
ORA-06553: PLS-306: wrong number or types of arguments in call to 'COPI_SCHE'
怎么了?
我尝试了很多与 PDO::PARAM_LOB|PDO::PARAM_INPUT_OUTPUT 的关联,但没有任何效果。
感谢您的帮助。
终于自己搞定了。
我不知道为什么 PDO::PARAM_LOB 在这种情况下不起作用。
解决方案是这样使用PDO::PARAM_STR:
$statement->bindParam(2, $result, PDO::PARAM_STR, 2048);
当我在 PHP 中使用 PDO 驱动程序调用存储过程时,如何从我的存储过程中获得输出 CLOB?
程序在Oracle中是这样定义的:
PROCEDURE COPI_SCHE(P_ID IN LOCT_SCHE.ID%TYPE, P_SCHE OUT CLOB)
其中 LOCT_SCHE.ID%TYPE 是 NUMBER (10)
如果我用 TOAD 调用它,它会起作用:
DECLARE test CLOB; BEGIN LOC_SH.COPI_SCHE(884, TEST); dbms_output.put_line(test); END ;
输出结果:
{ "ID" : "915", "FK_RA_NO_PERM" : "1234567", "TYPE_SCHE" : "PLP", "DESC_SCHE" : "test 4", "AN" : "", "TIMB_MAJ" : "15-04-10", "USAG_MAJ" : "USER" }
所以,在 PHP 中,我尝试这样做:
$connection = $this->getConnection(); $idGrouping = 884; $sql = "CALL LOC_SH.COPI_SCHE(?,?)"; $statement = $connection->prepare($sql); $statement->bindParam(1, $idGrouping, PDO::PARAM_INT); $statement->bindParam(2, $result, PDO::PARAM_LOB); $statement->execute();
但是 Oracle 抛出:
ORA-06553: PLS-306: wrong number or types of arguments in call to 'COPI_SCHE'
怎么了?
我尝试了很多与 PDO::PARAM_LOB|PDO::PARAM_INPUT_OUTPUT 的关联,但没有任何效果。
感谢您的帮助。
终于自己搞定了。
我不知道为什么 PDO::PARAM_LOB 在这种情况下不起作用。
解决方案是这样使用PDO::PARAM_STR:
$statement->bindParam(2, $result, PDO::PARAM_STR, 2048);