我正在尝试从我的PHP程序中执行Oracle程序。我创建了一个简单的测试程序:
CREATE OR REPLACE PROCEDURE "JKJ3"."GetUserLogin"
{
userlogin_in in varchar2,
userid_out out numeric,
pass_out out varchar2
}
IS
BEGIN
SELECT user_id, password
INTO userid_out, pass_out
FROM "JKJ3"."USERS"
WHERE login = userlogin_in;
END;
我使用Aqua Data Studio测试了该程序:
DECLARE
userid_out number;
password_out number;
BEGIN
"JKJ3"."GetUserLogin"('UserName', userid_out, password_out);
dbms_enable(10000);
dbms_put_line(userid_out);
dbms_put_line(password_out);
END;
这很好用,返回用户ID和密码值。到目前为止一切都很好!
我尝试从PHP执行该程序,但我无法让程序工作以挽救我的生命! PHP代码:
PutEnv("ORACLE_HOME=/afs/cad/solaris/oraclient10.2");
$this->conn=oci_connect($this->ucid, $this->dbpassword, $this->db);
// Check if connection was sucessful.
if ( !$this->conn ) {
echo "Unable to connect: " . var_dump( OCIError() );
die("Unable to connect: " . var_dump( OCIError() ));
}
$query = 'BEGIN "JKJ3"."GetUserLogin"(:login_in, :userid_out, :password_out); END;';
// Execute stored procedure to add new user and return the new users ID
$command = oci_parse($this->conn, $query) or die('Cannot parse query');
$userid;
$password_out;
// bind the input variables and out put variables.
oci_bind_by_name($command, ':login_in', $login, 30) or die('cannot bind login');
oci_bind_by_name($command, ':userid_out', $userid) or die('cannot bind userid');
oci_bind_by_name($command, ':password_out', $password_out, 300) or die('cannot bind password');
oci_execute($command);
echo 'userid = ' . $userid . ' password = ' . $password_out;
oci_close($this->conn);
当我执行此操作时,我得到一个null的用户标识和密码。
修改
我和其他程序有相同的结果,我甚至甚至创建了一个程序,它接受并为返回变量赋予静态值,但我仍然没有得到任何回复(包括没有错误)。
http://www.oracle.com/technetwork/articles/fuecks-sps-095636.html(以你的例子为例)。
这个过程再一次来自Aqua Data Studio,而不是来自PHP。抛出没有异常,没有返回变量。
Oracle是否有类似SQL SERVER Profiler的功能,允许您查看针对Oracle执行的查询? (虽然我没有服务器的管理员权限。)
似乎它可能是基于权限的,因为它适用于ADS。
我可以毫无问题地对数据库运行查询,因此我确信我的连接正常。
我错过了一些明显的东西吗?
答案 0 :(得分:3)
我不熟悉PHP,但根据oci_bind_by_name的manual页面:
使用OUT绑定时必须指定maxlength,以便PHP 分配足够的内存来保存返回的值。
此外,PL / SQL块中至少存在一个次要语法错误。在引用GetUserLogin
时,您需要始终使用双引号。 (虽然我怀疑这是你的主要问题。如果是,你应该得到一条错误信息。)
答案 1 :(得分:1)
在与之斗争之后,这是我的一系列错误(不是总是这样吗?):
没有PL / SQL块中的过程引用(并且问题的标记答案)。
$query = 'BEGIN "JKJ3"."GetUserLogin"(:login_in, :userid_out, :password_out); END;';
未启用错误报告(并查看问题所在)。
error_reporting(E_ALL);
ini_set('display_errors', true);
没有输出尺寸。
传递错误的变量,因为我已经转换了登录名和密码变量(羞耻地挂起头)。