2016-07-15 4 views
0

IF句内のいくつかの文を実行する必要があります。 しかし、私が直面している問題は、条件が偽であっても、ステートメントが実行されていることです。IF句内でselect/insert文を実行してください。Oracle

DECLARE 
    count_matching_row NUMBER := 0; 
    count_matching_tbl NUMBER := 0; 
BEGIN 
    SELECT COUNT(*) 
    INTO count_matching_tbl 
    FROM user_tables 
    WHERE LOWER(table_name) = 'tab1'; 
    IF(count_matching_tbl = 1) 
    THEN 

     SELECT COUNT (*) 
     INTO count_matching_row 
     FROM test1 
     WHERE ID IN (SELECT ID FROM tab1); 

     IF(count_matching_row = 0) 
     THEN 

      INSERT INTO review_case 
      SELECT 
       DISTINCT ID, d,e 
      FROM tab1 
      WHERE ID IS NOT NULL; 

      INSERT INTO review_case_payer 
      SELECT 
       a,b,c 
      FROM tab1 
      WHERE a IS NOT NULL; 
     COMMIT; 
     END IF; 
    END IF; 
END; 
/

これらの文を実行するたびに、テーブル 'tab1'が存在する場合は正常に動作します。 表TAB1は、私はエラー

取得存在しない場合、 "ORA-06550を:行13、列14: PL/SQL:ORA-00942:表またはビューが存在しない" をIはそれぞれのための同様のエラーを取得します私がテーブル "tab1"にアクセスしようとしている行

私はREFカーソルで試しましたが、それと同じですが、私はそれを挿入ステートメントに使用できません。

+0

テーブルが存在しない場合は、コードウォンまったくコンパイルしない - Oracleはテーブルが存在しないと不平を言うでしょう。静的SQLではなく動的SQLを使用する必要があります。 – krokodilko

+0

PL/SQLはコンパイルされた言語です。すべてが有効な参照で正常にコンパイルされなければならないか、JavaやPerlのように全く実行されません。スクリプト言語ではなく、行ごとに混乱しています。 –

答えて

1

このエラーは、存在しない可能性のあるテーブルを使用しているためです。このエラーは、スクリプトにデータの問題ではなくコンパイルの問題があるためスローされます。したがって、IFを使用すると、状況を処理するには不十分です。

存在しないオブジェクトを処理するには、いくつかの動的SQLを使用する必要があります。たとえば、以下を参照してください。

テーブルが存在しない場合は、何も行われません。

SQL> select * from tab1; 
select * from tab1 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> declare 
    2  vCountTab number; 
    3 begin 
    4  select count(1) 
    5  into vCountTab 
    6  from user_tables 
    7  where table_name = 'TAB1'; 
    8 
    9  if vCountTab = 1 then 
10   execute immediate 'insert into TAB1 values (1, 2)'; 
11  end if; 
12 end; 
13/

PL/SQL procedure successfully completed. 

表が存在する場合は、挿入が行われます。

SQL> create table tab1(a number, b number); 

Table created. 

SQL> declare 
    2  vCountTab number; 
    3 begin 
    4  select count(1) 
    5  into vCountTab 
    6  from user_tables 
    7  where table_name = 'TAB1'; 
    8 
    9  if vCountTab = 1 then 
10   execute immediate 'insert into TAB1 values (1, 2)'; 
11  end if; 
12 end; 
13/

PL/SQL procedure successfully completed. 

SQL> select * from tab1; 

     A   B 
---------- ---------- 
     1   2 

SQL> 
+0

これで問題は解決しません。テーブルを持っていないとうまく実行されますが、テーブルがあるとエラー "ORA-00905:missing keyword"が表示されます – Mitali

+0

@Mitali投稿したとおりに試しましたか?あなたがそれを変更した場合は、動的SQLをチェックし、おそらく何らかのエラーがある場合 – Aleksej

+0

はい、しかし私は2つの条件があります。 1つはifの中で選択し、次に2つのinsertを別のifに入れます。私はそれらと即座に実行しようとしました。 – Mitali

関連する問題