【发布时间】: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