【发布时间】:2018-01-27 02:27:08
【问题描述】:
这是我到目前为止所做的。我创建了这个对象和对象表。
CREATE TYPE my_obj as object(
val1 varchar2(30),
val2 varchar2(30),
val3 varchar2(30));
create TYPE table_obj IS TABLE OF my_obj;
在我的程序中,我这样做:
PROCEDURE MYPROC(
TABLEOBJ OUT table_obj,
MYCURSOR OUT OTHERPCK.REFCURSOR,
...other IN param)
AS
--other code
在 LOOP 中,我需要进行查询,它会在每次迭代时提供三个 varchar2 值作为输出(即 val1、val2、val3),我需要将它们存储在 TABLEOBJ 中,并在查询此表后放入所有结果在我的参考光标上,所以:
BEGIN
FOR SOMETHING IN SOMETHINGELSE LOOP
SELECT my_obj(VAL1, VAL2, VAL3) BULK COLLECT INTO TABLEOBJ
FROM ...
WHERE ...
ENDLOOP;
OPEN MYCURSOR FOR SELECT * FROM TABLE(TABLEOBJ);
代码编译没有问题,但我在 MYCURSOR 中只得到一行,而且肯定不止一行。我也试过:
SELECT VAL1, VAL2, VAL3 INTO TABLEOBJ
但我明白了:
PL/SQL: ORA-00947: not enough values
如何将选择的每个结果(总是这三个 varchar2 中的一行)并保存到 TABLEOBJ?
【问题讨论】:
-
为什么要使用循环?如果您在循环中的选择每次只返回 1 行,那么您将继续覆盖集合并最终只返回 1 行。
bulk collect的重点是一次性选择所有您需要的行(或者如果一次性获取的行太多,则至少选择一批)。 -
因为我的 WHERE 条件不同,并且基于显式引用光标“SOMETHINGELSE”内的“SOMETHING”列。你知道不使用批量收集来完成这项任务的方法吗?
-
您仍然应该尝试将
somethingelse查询与您在循环内执行的任何查询结合起来,这样您就可以得到一个包含所有相关数据的结果集 - 然后您 @ 987654328@ 加入您的收藏。如果不了解这些查询实际上是什么,很难更具体。