FORALL SELECT获取NO DATA FOUND

时间:2017-07-13 13:37:51

标签: sql oracle plsql bulk

与发布的问题类似(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是有效的语法,但对检查数据无效吗?

4 个答案:

答案 0 :(得分:3)

  

我最近发现我可以将FORALLSELECT一起使用。

不,你不能。

阅读关于manual的罚款FORALL Statement

  

<强> dml_statement

     

在其VALUES或WHERE子句中引用至少一个集合的静态或动态INSERT,UPDATE,DELETE或MERGE语句。性能优势仅适用于使用索引作为索引的集合引用。

因此,我不能将forallselect一起使用。 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如上所述是不可能的。您需要遍历每条记录,然后查找计数。这将是我建议的替代方案。