我在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参数?
我已经搜索了很多网站,但仍然不知道如何使这项工作。
你在甲骨文中拥有的不仅仅是一个数组,而是一个记录数组。。。。因此,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等中插入 我正在试着做下面的程序,