当前位置: 首页 > 知识库问答 >
问题:

PHP-PL/SQL:如何将数组(作为Oracle过程中的OUT参数)读入PHP

黎震博
2023-03-14

我在Oracle数据库中有一个过程,其中有一个数组作为输出参数。在这个过程中,我将所有球队及其得分放入一个数组中。

create or replace package pck_tournament
as

  type trranking  is record (
            position  number
       ,    team   VARCHAR2(20)
       ,    points  number 
  );
  type taranking is table of trranking;

  procedure retrieve_ranking (oparray  out taranking);
end 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参数?

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

共有1个答案

姬墨竹
2023-03-14

你在甲骨文中拥有的不仅仅是一个数组,而是一个记录数组。。。。因此,PHP中的标准数组将无法处理它。

根据下面关于堆栈溢出的问题,你需要告诉PHP类型会是什么样子

PHP:将变量绑定到表类型输出参数

所以使用下面的(替换您的类型和模式)

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

另一个问题还有一个链接,链接到一个很好的资源,可以找到更多关于这个问题的信息。

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

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

 类似资料:
  • 问题内容: 如何指定参数为表名? 问题答案: 你不能 相反,您需要将其作为VARCHAR2字符串传递,然后使用动态SQL: 阅读有关Dynamic SQL的信息, 并注意如果不正确地使用它会带来的问题,例如性能,可伸缩性和安全性较差。

  • 我试图从JDBC调用以下pl/sql过程。 这就是我试图调用它的方式,但没有成功: 我刚刚读到oracle jdbc不支持pl/sql结构类型。因此,这在“无效名称模式:test.testrec_r”中失败 如何从Java调用这个过程?理想情况下,只使用java库/API,但这似乎几乎是不可能的,在简单的sql调用中封装pl/sql包并调用它的最佳解决方案是什么? 另外,我正在使用Spring J

  • 问题内容: 我正在尝试将oracle过程调用的out参数强制转换为对象。它不起作用,因为-就我所知- 我需要定义一个映射,告诉该方法如何投射它。如果地图是空的或未正确填充,则默认为STRUCT类型的Objekt-在我的情况下这是错误的。 我建立了一个示例,该示例应说明该问题: 由于地图错误,我无法使用以下方式: 我应该如何填写地图? 编辑1 oracle数据库中的条目无法更改。我只被允许使用它们。

  • 问题内容: 我的包体内有一个proc: 我在包装规格中公开了这一点。 如何在PL SQL Developer(或类似版本)的新SQL窗口中执行此过程? 问题答案: 您可以相对轻松地执行该过程 当然,这只是将游标返回到调用应用程序。它不执行任何操作来从游标中获取数据,对该数据执行任何操作或关闭游标。假设您的目标是向其中写入一些数据(有时对于原型设计很有用,但生产代码不应该依赖该数据),则可以执行以下

  • 我们的PL/SQL数据库有三个数字变量,分别表示确切的日期、月份和年份。 我想在Java中将这些值读入一个字符串来显示,但是rs.getString(“[Number_字段]”)会显示一个“Invalid Column Name”异常,而rs.getInt(“[Number_字段]”)会执行相同的操作(见下面的代码段)。而且,因为单词“number”被用来描述编码历史上创建的每一个字符串转换,所以

  • 我是pl/sql编程新手,我需要你的帮助。 我想做个手术。 更具体地说,我有如下表1 对于相同的COL1和COL2/COL3,请检查从COL4中选择不同的值,例如COL1=600、COL2=140/COL3=2和COL2=150/COL3=3返回20和35 并在此表TABLE1中插入行 如果P_FLG1='Y',我在表1中插入。如果P_FLG2='Y',我也在表3等中插入 我正在试着做下面的程序,