微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle过程输出参数从PHP返回-1

我正在尝试使Oracle过程从我的PHP程序执行.我创建了一个简单的测试过程:

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;

这可以正常工作,返回用户标识和密码值.到现在为止还挺好!

我尝试从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(sayHello示例).
该过程再次在Aqua Data Studio中起作用,但在PHP中不起作用.没有引发异常,没有返回任何变量.

Oracle是否具有类似sql SERVER Profiler的功能,使您可以查看针对Oracle执行的查询? (尽管我没有服务器的管理员权限).

由于它可以在ADS上正常运行,因此看起来好像不是基于权限的.

我可以毫无问题地对数据库运行查询,因此我确信我的连接正在工作.

我是否缺少明显的东西?

解决方法:

我不熟悉PHP,但是根据oci_bind_by_name的manual页面

You must specify maxlength when using an OUT bind so that PHP
allocates enough memory to hold the returned value.

另外,您的PL / sql块中至少有一个较小的语法错误.引用GetUserLogin时,必须始终使用双引号. (尽管我怀疑这是您的主要问题.如果是,您应该会收到一条错误消息.)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐