【问题标题】:PHP - PL/SQL: How to read array (as OUT parameter from Oracle procedure) into PHPPHP - PL/SQL:如何将数组(作为 Oracle 程序的 OUT 参数)读入 PHP
【发布时间】:2020-07-29 00:19:27
【问题描述】:

我的 Oracle DB 中有一个过程,其中一个数组作为输出参数。在此过程中,我将所有团队及其分数放入一个数组中。

创建或替换包 pck_tournament
作为

  类型排序是记录(
            职位编号
       , 团队 VARCHAR2(20)
       , 点数
  );
  类型 taranking 是 trranking 表;

  过程retrieve_ranking(oparray out taranking);
结束 pck_tournament;

但是当我尝试使用 PHP 调用此过程时,我总是会收到如下错误:

PLS-00306:调用“RETRIEVE_RANKING”时参数的数量或类型错误

这是我的 PHP 代码的一部分:

 $out_arr = array();
    $stmt = oci_parse($conn, "BEGIN pck_tournament.retrieve_ranking(:taranking); END;");
    oci_bind_array_by_name($stmt,":taranking", $out_arr, 10000, 10000, SQLT_CHR);
    oci_execute($stmt); 

如果我将 OUT 参数更改为 VARCHAR2 进行测试,我可以读取结果。但如果它是一个数组,我无法让它工作。

所以问题一定是我使用了错误类型的参数来存储我的 OUT 参数?

我已经搜索了很多网站,但仍然不知道如何进行这项工作。

【问题讨论】:

  • 您可能需要从使用 PL/SQL 记录数据类型和 PL/SQL 定义的数组更改为使用 SQL 定义的对象和集合数据类型(使用 CREATE TYPE trranking IS OBJECT( ... );CREATE TYPE taranking IS TABLE OF trranking;.
  • 好点@MT0,你很正确会更新我的答案。
  • @MT0 我将其更改为 SQL 定义的对象和集合数据类型,如您所说,在 PHP 中我将代码更改为:$stmt = oci_parse($conn, "BEGIN pck_tournament.retrieve_ranking(:taranking); END;"); $taranking = oci_new_collection($conn, 'TARANKING', '***'); oci_bind_by_name($stmt, ':taranking', $taranking, 8, OCI_B_NTY); oci_execute($stmt); 现在没有错误了!如何在 PHP 中“回显”每个对象的所有项目? @ShaunPeterson

标签: php oracle plsql


【解决方案1】:

你在 oracle 中拥有的不仅仅是一个数组,它是一个记录数组......所以 PHP 中的标准数组将无法处理它。

根据 Stack Overflow 上的以下问题,您需要告诉 PHP 类型将是什么样子

PHP: Binding variable to table type output parameter

所以使用下面的(替换你的类型和架构)

$table_output = oci_new_collection($conn,'some_table_type','schema');

另一个问题也有一个很好的资源链接,可用于查找有关此问题的更多信息。

正如@MT0 所指出的,您还必须更改定义类型的方式。您可以按照建议将其更改为对象或将其保留为记录,但主要更改是将声明移到您的包之外。

如果它们只在包中定义,PHP 将无法看到它们。

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多