3

我正在尝试从我的 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 的用户 ID 和密码。

编辑 我与其他过程有相同的结果,哎呀,我什至创建了一个过程,该过程采用静态值并将其分配给返回变量,但我仍然没有得到任何回报(包括没有错误)。
http://www.oracle.com/technetwork/articles/fuecks-sps-095636.html(sayHello示例)。再一次,该过程在 Aqua Data Studio 中有效,但在 PHP 中无效。不抛出异常,不返回变量。

Oracle 是否有类似 SQL SERVER Profiler 的工具,可以让您查看针对 Oracle 执行的查询?(虽然我没有服务器的管理员权限)。

似乎它不是基于许可的,因为它适用于 ADS。

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

我错过了一些明显的东西吗?

4

2 回答 2

3

我不熟悉 PHP,但根据 oci_bind_by_name 的手册页:

使用 OUT 绑定时必须指定 maxlength,以便 PHP 分配足够的内存来保存返回的值。

此外,您的 PL/SQL 块中至少存在一个小语法错误。引用时需要始终使用双引号GetUserLogin。(尽管我怀疑这是您的主要问题。如果是,您应该会收到一条错误消息。)

于 2012-07-05T05:58:33.930 回答
1

在与此作斗争之后,我犯了许多错误(不是总是这样吗?):

  1. PL/SQL 块中的过程没有引号(并标记了问题的答案)。

    $query = 'BEGIN "JKJ3"."GetUserLogin"(:login_in, :userid_out, :password_out); END;';

  2. 没有打开错误报告(并查看问题所在)。

error_reporting(E_ALL); ini_set('display_errors', true);

  1. 没有输出尺寸。

  2. 传递了错误的变量,因为我将登录名和密码变量转置了(羞愧地垂头丧气)。

于 2012-07-05T23:25:12.563 回答