2012-11-23 2 views
0

오라클 데이터베이스에서 테이블을 생성하기 전에 날씨가 있는지 확인하고 싶습니다. 다음 문은 7 행 (CREATE)에 ORA-06550 오류가 발생하지 않습니다.ORA-06550 테이블이 있는지 확인하려고 할 때

DECLARE cnt NUMBER; 
    BEGIN 
    SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name) = lower('TestTable'); 

    IF(cnt = 0) 
    THEN 
     CREATE TABLE TestTable 
     (
     TestFlag NUMBER(1) NOT NULL 
    ); 
    END IF; 
    END; 

누구나 나를 도와 줄 수 있습니까?

미리 감사드립니다.

답변

2

오라클에서 테이블을 만드는 것은 큰 일입니다. 그렇다면이 코드가 실행중인 경우 중지하십시오. 임시 테이블을 대신 사용하십시오. 그러나 실패의 이유는 DDL이 PL/SQL이 아닌 SQL에서 실행되어야한다는 것입니다.

DECLARE cnt NUMBER; 
    BEGIN 
    SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name) = lower('TestTable'); 

    IF(cnt = 0) 
    THEN 
     execute immediate 'CREATE TABLE TestTable (testFlag NUMBER(1) NOT NULL)'; 
    END IF; 
    END; 
+0

ps 다른 스키마가 동일한 테이블 이름을 갖고있는 것처럼 USER_TABLES도 사용하고 있어야합니다. 자신의 스키마에서 create를 건너 뛰고 싶습니까? – DazzaL

+0

USER_TABLES 힌트를 가져 주셔서 감사합니다. 업데이트 메커니즘에서 비슷한 코드를 사용하고 쿼리가 이미 실행 된 경우 (테이블이 이미 생성 된 경우) 오류를 얻고 싶지 않습니다. – Powerslave

1
DECLARE cnt NUMBER; 
    BEGIN 
    SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name) 
                  = lower('TestTable'); 

    IF(cnt = 0) 
    THEN 
     EXECUTE IMMEDIATE 'CREATE TABLE TestTable (TestFlag NUMBER(1) NOT NULL)'; 
    END IF; 
    END; 
+0

m8을 고맙습니다. – Powerslave

2

개인적으로, 나는 당신이 테이블 그런 식으로 만들려는 것이 어떤 이유를 볼 수 있지만, 여기에 존재하지 않는 경우 테이블을 생성하는 또 다른 방법입니다하지 않습니다

SQL> declare 
    2  table_exists exception; 
    3  pragma exception_init(table_exists, -955); 
    4 begin 
    5  execute immediate 'create table TestTable(TestFlag number(1) not null)'; 
    6  dbms_output.put_line('table created'); 
    7 exception 
    8  when table_exists 
    9  then dbms_output.put_line('table exists'); 
10 end; 
11/

table created 

SQL> declare 
    2 table_exists exception; 
    3 pragma exception_init(table_exists, -955); 
    4 begin 
    5 execute immediate 'create table TestTable(TestFlag number(1) not null)'; 
    6 dbms_output.put_line('table created'); 
    7 exception 
    8 when table_exists 
    9 then dbms_output.put_line('table exists'); 
10 end; 
11/

table exists 

PL/SQL procedure successfully completed 
+0

m8, 고맙습니다. – Powerslave

관련 문제