与发布的问题类似(PL/SQL No Data found error on forall loop),
我最近刚发现我可以FORALL
使用SELECT
。所以我在PL / SQL块中尝试了以下代码:
FORALL i in p_eit_hdr_rec.first..p_eit_hdr_rec.last
select count(*)
into l_exists
from TABLE_X x1
, TABLE_Y x2
, TABLE_Z x3
where x2.batch_name = p_eit_hdr_rec(i).batch_name
and x1.person_id = x2.person_id
and x2.status = 'New'
and x3.information_type = x1.information_type
and x3.EIT_INT_HDR_ID = x2.EIT_INT_HDR_ID;
p_eit_hdr_rec
是一个关联数组,p_eit_hdr_rec(i).batch_name
包含字符串' hire_20170711_200005.csv' l_exists
是NUMBER变量,默认为0
。
即使我确认在我将其作为普通SQL查询时确认存在数据,我也会收到NO_DATA_FOUND
异常:
select count(*)
into l_exists
from TABLE_X x1
, TABLE_Y x2
, TABLE_Z x3
where x2.batch_name = 'hire_20170711_200005.csv'
and x1.person_id = x2.person_id
and x2.status = 'New'
and x3.information_type = x1.information_type
and x3.EIT_INT_HDR_ID = x2.EIT_INT_HDR_ID;
COUNT(*)
--------
2
为什么我会得到例外? FORALL SELECT
是有效的语法,但对检查数据无效吗?
答案 0 :(得分:3)
我最近发现我可以将
FORALL
与SELECT
一起使用。
不,你不能。
阅读关于manual的罚款FORALL Statement:
<强> dml_statement 强>
在其VALUES或WHERE子句中引用至少一个集合的静态或动态INSERT,UPDATE,DELETE或MERGE语句。性能优势仅适用于使用索引作为索引的集合引用。
因此,我不能将forall
与select
一起使用。 select
的相应bulk SQL操作为SELECT INTO Statement with BULK COLLECT Clause。
快乐阅读!
答案 1 :(得分:1)
FOR ALL语句通常用于执行像INSERT UPDATE DELETE这样的DML语句。这就是你得到异常的原因。
答案 2 :(得分:0)
除了其他评论之外,这里有一个如何使用FORALL与BULK COLLECT的例子:
declare
TYPE ARRAY IS TABLE OF TABLE1%ROWTYPE;
obj_data ARRAY;
i integer;
CURSOR c1 IS
SELECT * FROM TABLE1;
begin
OPEN c1;
LOOP
FETCH c1 BULK COLLECT INTO obj_data limit 32768;
FORALL i IN 1..obj_data.COUNT
INSERT /*+ append */ INTO TABLE2
VALUES obj_data(i);
EXIT WHEN c1%NOTFOUND;
END LOOP;
commit;
CLOSE c1;
end;
/
答案 3 :(得分:0)
Avery简单的解释是你的关联数组可能包含元素列表而不是sinlge元素。现在,您已尝试仅使用一个元素查询SQL语句。
其次FORALL SELECT
如上所述是不可能的。您需要遍历每条记录,然后查找计数。这将是我建议的替代方案。