ORA-01036:调用存储函数时非法变量名/号

时间:2014-11-23 12:46:45

标签: php oracle laravel-5

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

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

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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_LNG类型而不是SQLT_INT,因为它可能无法在Unix系统上正常运行并且为int(-4294967295)提供一切(溢出)。与公众相信,Windows适用于SQLT_INTSQLT_LNG,因此我建议使用SQLT_LNG兼容性问题。

答案 2 :(得分:-1)

@Cunning:请尝试以下选项。

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

    $ bindings = [&#39;:v_res&#39; =&GT; &安培; $ result,&#39;:p_user&#39; =&GT; &#39; test&#39;,&#39;:p_pass&#39; =&GT; &#39; 1234&#39;];