【发布时间】:2019-09-13 23:26:07
【问题描述】:
我们有一个名为“Get()”的现有 PL SQL 过程,当提供一个 order_no_ 和一个 sequence_no_ 时,它返回一个名为“CURSOR_TYPE”的命名 REF CURSOR 类型。我需要对此方法进行“重载”,程序员只需传入 order_no_(无 sequence_no_),它会重复调用该方法并将所有 sequence_no_ 值的所有记录收集到单个返回“CURSOR_TYPE”REF CURSOR 中。以下是我为实现这一目标而写的内容,并尝试遵循示例shown here。
PROCEDURE Get(order_no_ IN VARCHAR2, results_cursor OUT CURSOR_TYPE)
AS
--Declare a "nested table type" table
TYPE CoC_RowType IS TABLE OF customer_order_charge_cfv%ROWTYPE;
CoC_RowTable CoC_RowType := CoC_RowType();
CURSOR c1 IS
SELECT coc.SEQUENCE_NO
FROM customer_order_charge_cfv coc
WHERE coc.ORDER_NO = order_no_;
BEGIN
FOR i in c1 LOOP
CoC_RowTable.extend();
Get(order_no_, i.sequence_no, results_cursor);
FETCH results_cursor INTO CoC_RowTable(CoC_RowTable.count);
END LOOP;
OPEN results_cursor FOR SELECT * FROM TABLE(CoC_RowTable);
END Get;
但是,当我尝试将此代码编译到我的包中时,我收到以下错误:
Compilation errors for PACKAGE BODY GLOB1APP.GFS_CUSTOMER_ORDER_CHARGE_CFP
Error: PLS-00382: expression is of wrong type
Line: 81
Text: OPEN results_cursor FOR SELECT * FROM TABLE(CoC_RowTable);
Error: PL/SQL: ORA-22905: cannot access rows from a non-nested table item
Line: 81
Text: OPEN results_cursor FOR SELECT * FROM TABLE(CoC_RowTable);
Error: PL/SQL: SQL Statement ignored
Line: 81
Text: OPEN results_cursor FOR SELECT * FROM TABLE(CoC_RowTable);
这行似乎出错了:
OPEN results_cursor FOR SELECT * FROM TABLE(CoC_RowTable);
我做错了什么?我怎样才能实现我的目标?这完全是错误的途径吗?
【问题讨论】:
-
您是否调查过您遇到的错误?有许多问题和答案说明您不能在这样的 SQL 查询中使用 PL/SQL 集合类型。您是否能够改为创建模式级对象和表类型? (正如您链接到的问题的公认答案一样;评论指的是并不总是可取的......)
-
@AlexPoole 对于此更改的要求,我不允许创建任何架构级别的对象/类型,所有内容都必须在此包/方法的范围内。
-
那你恐怕有点卡住了。您将不得不让这个程序复制原始程序正在执行的操作,只是没有序列号。这对于可维护性来说不是好消息,但对于性能来说可能是个好消息。
-
@AlexPoole 谢谢,这就是我害怕的 - 必须复制并粘贴原始的 Get() 方法并修改其 where 子句......我想通过重载来避免这种情况,就像你说,为了提高可维护性......但如果你说如果不创建新的模式级对象就不可能实现这个目标......那么呃......我想我必须做我所拥有的要做...感谢您的帮助。
标签: oracle plsql oracle11g ref-cursor rowtype