2016-05-31 1 views
1

아래의 PLSQL 블록에 문제가 있습니다. 코드가 아래와 같이 (루프없이) 실행되면 스크립트가 성공합니다. 그러나 루프의 주석을 제거 할 때 select 문에있는 테이블을 찾을 수 없다는 오류가 발생합니다. 내가 확인할 때, 실제로 테이블이 전혀 만들어지지 않았다는 것을 알았습니다. 루프가 실행 바로 전에 실행하려고하는 것과 거의 같습니다.create table via execute immediate가 작동하지 않습니다.

예 어쨌든 테이블이 채워지지 않으므로 print 명령문은 관계없이 표시되지 않지만 쿼리가 실패하지는 않을 것이라고 알고 있습니다.

begin 
    execute immediate 'create table tbl_temp (oid_value number(20) ,rowid_field varchar2(20))'; 

    /*for nullval in (select oid_value from tbl_temp) 
    loop 
     DBMS_OUTPUT.PUT_LINE('something'); 
    end loop;*/ 
end; 
+3

이와 같은 테이블을 만드는 것은 좋은 아이디어는 아니지만 타이밍 문제입니다. EXECUTE IMMEDIATE에 테이블을 작성 중입니다. 커서 루프는 실행될 때까지 컴파일시에 유효성이 검사됩니다. 따라서 코드가 실행될 때 테이블이 존재하지 않습니다. –

+0

두 개의 시작과 두 개의 끝이있는 경우 작동 할 수 있습니다. 실행을 위해 한 번, 루프를 위해 한 번. – xQbert

+0

좋아요. 또한 이유를 설명하기 위해 적어도 잠시 시간을내어 주시면 감사하겠습니다. 나는 PLSQL에 익숙하지 않지만 이것을 알아 내려고 노력했지만 간단히 할 수 없었다. – NenadK

답변

4

이 코드를 실행하려고하면 오라클은 먼저 올바른지 확인하여 사용하는 테이블이 모두 존재하는지 확인합니다.

처음에는 테이블이 존재하지 않으므로이 코드는 오류를 발생시키고 아무 것도 수행되지 않습니다.

즉석에서 테이블을 만든 다음 쿼리를 작성하려면 (이 방법은 좋지 않습니다.) 동적 SQL을 기반으로 커서를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

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


SQL> declare 
    2  cur sys_refcursor; 
    3  val number(20); 
    4 begin 
    5  execute immediate 'create table tbl_temp (oid_value number(20) ,rowid_field varchar2(20))'; 
    6 
    7  open cur for 'select oid_value from tbl_temp'; 
    8  loop 
    9   fetch cur into val; 
10   exit when cur%notfound; 
11   dbms_output.put_line('val = ' || val); 
12  end loop; 
13 end; 
14 
15 
16/

PL/SQL procedure successfully completed. 

SQL> select * from tbl_temp; 

no rows selected 

SQL> 
관련 문제