0

次のコードブロックがあります。

DECLARE
  CURSOR c_cursor IS
    SELECT *
    FROM   table_a;

    FOR i IN c_cursor LOOP
    IF i.id NOT IN (SELECT id FROM table_b WHERE ind_val='Y')
     THEN
      BEGIN
        INSERT INTO val_table_err
        VALUES (''ERROR:id''|| i.id,
                1,
                1,
                NULL,
                1,
                i.type_cd);
      END;
    END IF;
    END LOOP; 

エラーが発生していますPLS-00405: SUBQUERY NOT ALLOWED IN THIS CONTEXT

この問題を解決するための助けをいただければ幸いです。

4

2 に答える 2

1

これは、Oracle のバージョンとは関係ありません。IF ステートメント内で NOT IN とサブクエリを使用できないため、11g でも同じエラーが発生しました。

これが私のテストケースです:

create table table_a (idA number);
create table table_b (idB number);

insert into table_a values(1);
insert into table_a values(2);
insert into table_b values(1);
commit;

この匿名の pl/sql ブロッ​​クは、あなたのものと同じエラーを受け取ります:

DECLARE
  i number;
  CURSOR c_cursor IS
    SELECT idA
    FROM   table_a;
begin
    FOR i IN c_cursor LOOP
    IF i NOT IN (SELECT idB FROM table_b)
     THEN
        dbms_output.put_line(i);
    END IF;
    END LOOP; 
end;
/

代わりに次のようにしてみてください。

DECLARE
  CURSOR c_cursor IS
    SELECT idA, idB
    FROM   table_a a left join table_b on idA=idB;
  i c_cursor%rowtype;
begin
    FOR i IN c_cursor LOOP
    IF i.idB is null
     THEN
        dbms_output.put_line(i.idA);
    END IF;
    END LOOP; 
end;
/

ネストされたループを自分で行うのではなく、オラクルに結合アルゴリズムを選択させるという利点があります。

于 2014-08-18T20:33:27.160 に答える