【问题标题】:Returning a Table over OCI8 from Oracle Stored Procedure从 Oracle 存储过程返回 OCI8 上的表
【发布时间】:2012-01-04 03:19:34
【问题描述】:

我正在通过 OCI8 连接到 Oracle。

我有一个存储过程:

  PROCEDURE ocigetaccounts(accounts OUT SYS_REFCURSOR)
  IS BEGIN
  OPEN accounts FOR
        SELECT * FROM tbaccounts;
  END ocigetaccounts;

我正在尝试使用 OCI 将其返回给 PHP:

$sqlString = 'BEGIN accounts.ocigetaccounts(:accounts); END;';
oci_bind_by_name($statement, ':accounts', $result, -1);
    echo $result;

(其余所需的 php 端 OCI 已到位。)

我得到的错误是:

警告:oci_execute():ORA-06550:第 1 行,第 7 列:PLS-00306:调用“OCIGETACCOUNTS”时参数的数量或类型错误

如何获取 $result 来容器表资源

【问题讨论】:

    标签: php oracle oracle-call-interface


    【解决方案1】:

    PHP 和 REFCURSORS 存在问题。有关完整说明和解决方法,请参阅这篇出色的博客文章:

    http://blogs.oracle.com/opal/entry/converting_ref_cursor_to_pipe

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      据我所知,$result 将包含您所追求的资源。 您得到的错误是因为游标未定义为类型游标。 您必须将$result 显式定义为游标

      $result = oci_new_cursor( $dbci );
      

      如果返回$result,它将作为资源返回,您应该像处理任何其他返回的资源一样处理它。

      对于您的示例($dbci 是您的连接资源):

      $sqlString = 'BEGIN accounts.ocigetaccounts(:accounts); END;';
      
      $stmt = oci_parse ( $dbci, $sqlString );
      //Declare cursor
      $result = oci_new_cursor( $dbci );
      
      //Bind cursor
      oci_bind_by_name ( $stmt, ':accounts', $result, -1, OCI_B_CURSOR);
      
      //Execute query
      if (oci_execute ( $stmt )) {
          //Execute cursor
          oci_execute($result);  //Or you can return the cursor.
      }
      

      这就是我们处理从数据库返回的游标的方式。 希望这能解决问题

      【讨论】:

        猜你喜欢
        • 2011-01-31
        • 2016-04-09
        • 2019-06-03
        • 1970-01-01
        • 1970-01-01
        • 2014-08-31
        • 1970-01-01
        • 1970-01-01
        • 2022-08-07
        相关资源
        最近更新 更多