我的oracle db中有一个存储过程。假设我的包名是myPackage,程序名是myProcedure,在该过程中有两个参数,一个是varchar2 IN参数,另一个是varchar2 OUT参数。我使用了以下代码
<?php
$conn = oci_connect("username", "password", "123.456.7.890/XXX");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}
$p1 = 'MUKUND';
$p2 = 'g';
$stid = oci_parse($conn, "begin xx_sample.sayHello(:p1, :p2); end;"
oci_bind_by_name($stid, ':p1', $p1);
oci_bind_by_name($stid, ':p2', $p2);
oci_execute($stid);
print "$p2\n";
oci_free_statement($stid);
oci_close($conn);
并在xx_sample.sayHello中查看规范和正文
CREATE OR REPLACE package APPS.xx_smpl
AS
procedure sayHello (name1 IN VARCHAR2, greeting OUT VARCHAR2) ;
END;
/
体
CREATE OR REPLACE package body APPS.xx_smpl AS
PROCEDURE sayHello (name1 IN VARCHAR2, greeting OUT VARCHAR2)
IS
BEGIN
greeting := 'Hello ' || name1;
END;
END;
/
我在sqldeveloper中运行它,我得到了结果但是当我通过上面的代码在php中运行它时,我没有得到任何输出。
还有一件事需要提及的是,有些教程经历了i didnt find any tutorial where the procedure is called via package.
所以我创建了另一个程序,我在这个网站上找到了
http://php.net/manual/en/oci8.examples.php
我创建了以下程序,这次没有包,
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$p1 = 8;
$stid = oci_parse($conn, 'begin myproc(:p1, :p2); end;');
oci_bind_by_name($stid, ':p1', $p1);
oci_bind_by_name($stid, ':p2', $p2, 40);
oci_execute($stid);
print "$p2\n"; // prints 16
oci_free_statement($stid);
oci_close($conn);
相应的程序是
CREATE OR REPLACE PROCEDURE myproc(p1 IN NUMBER, p2 OUT NUMBER) AS
BEGIN
p2 := p1 * 2;
END;
但是这次我运行这个php文件时得到了输出!!!
所以有人请告诉我,我做错了什么?请帮助我获得输出