0

我尝试调用返回数字的包中的存储函数:

function LOGIN(USERNAME in varchar2 default null
               , PASSWORD in varchar2 default null) 
         return number;

它返回 0 或负整数表示失败,返回正整数表示成功。这是我调用该函数的 PHP 代码:

$sql = ":v_res := PACK.LOGIN(:p_user, :p_pass)";
$bindings = [ ':p_user' => 'test', ':p_pass' => '1234', ':v_res' => & $result];

$statement oci_parse($connection, $sql);
foreach ($bindings as $k => & $v) {
    oci_bind_by_name($statement, $k, $v, customSizeOf($v), determineSqlType($v));
}

oci_execute($statement);

当我使用如图所示的结果(在绑定中使用之前未定义)时,它会返回“未定义的变量”警告。如果我取消警告并继续前进,它将与 null、-1 大小和类型 1 (SQLT_CHR) 绑定;如果我将结果定义$result = -1;为 ,它与 -1、PHP_INT_SIZE 的大小和类型 3 (SQLT_INT) 绑定。

无论哪种方式,在执行时,都会产生此错误

ORA-01036: illegal variable name/number
4

3 回答 3

1

这不起作用,因为您必须将调用包装在 PL/SQL 块或 SQL 查询中:

$sql = "BEGIN :v_res := PACK.LOGIN(:p_user, :p_pass); END";

或者

$sql = "SELECT caller(:p_user, :p_pass) v_res FROM DUAL"
于 2014-11-23T14:24:35.760 回答
0

这有效,我已经不知道为什么,但它有效:

$result = -1;

$sql = <<<"SQL"
begin
    :V_RETURN := PACK.LOGIN(
        USERNAME => :USERNAME,
        PASSWORD => :PASSWORD
    );
end;
SQL;

$bindings = [
    ':USERNAME' => $username,
    ':PASSWORD' => $password,
    ':V_RETURN' => & $result,
];

$statement oci_parse($connection, $sql);
foreach ($bindings as $k => & $v) {
    oci_bind_by_name($statement, $k, $v, customSizeOf($v), determineSqlType($v));
}

oci_execute($statement);

它应该通过引用传递给数组,但仍然不知道它为什么起作用,另一个抛出绑定错误;如果有的话,它应该绑定一个内存,它不会是$result

更新:最好使用SQLT_LNGtype 而不是,SQLT_INT因为它可能无法在 Unix 系统上正常工作并放弃int(-4294967295)一切(溢出)。与公众的看法相反,Windows 对两者都适用SQLT_INTSQLT_LNG因此我建议在兼容性问题上使用SQLT_LNG.

于 2014-11-23T15:02:09.623 回答
-1

@Cunning:请尝试以下选项。

  1. 检查http://php.net/manual/en/oci8.examples.php
  2. 尝试更改绑定顺序

    $bindings = [':v_res' => & $result, ':p_user' => 'test', ':p_pass' => '1234'];

于 2014-11-23T15:15:14.470 回答