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 : 테이블 또는 뷰가 존재하지 않습니다" 내가 각각 유사한 오류가 발생할 수 테이블 "tab1"에 액세스하려고 시도하는 줄

참조 커서로 시도했지만 여전히 동일합니다. 삽입 문에 사용할 수 없습니다.

+0

, 다음 코드 원 전혀 컴파일하지 않습니다. 오라클은 테이블이 존재하지 않는다고 불평 할 것입니다. 정적 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

네,하지만 두 조건이 있습니다. 하나는 if 안에, 그리고 두 개의 insert는 다른 것에 삽입합니다. 나는 그들과 즉시 실행을 시도했다. – Mitali