【问题标题】:ORA-01036: illegal variable name/number while calling stored functionORA-01036: 调用存储函数时变量名称/编号非法
【发布时间】:2014-11-23 12:46:44
【问题描述】:

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

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

【问题讨论】:

    标签: php oracle laravel-5


    【解决方案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"
    

    【讨论】:

      【解决方案2】:

      这行得通,我已经不知道为什么了,但是它行得通:

      $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

      【讨论】:

        【解决方案3】:

        @Cunning : 请尝试以下选项。

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

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

        【讨论】:

        • 绑定不能这样工作。这就是与 oci8 正确绑定的美妙之处。它不依赖于顺序;但它对字节中的数据长度很敏感。
        猜你喜欢
        • 2013-01-06
        • 2011-10-05
        • 1970-01-01
        • 2020-07-29
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-11
        相关资源
        最近更新 更多