2013-05-19 3 views
3

테이블을 생성하는 스크립트가 필요합니다. 이미 존재하는 경우 테이블을 삭제하고 테이블을 다시 작성할 때 필요합니다. 일부 연구 후 pl/sql의 CREATE OR REPLACE TABLE이 존재하지 않는다는 것을 알게되었습니다. 그래서 나는이 스크립트를 생각해 낸다 :오라클 pl/sql에서 테이블을 만들거나 바꿉니다

DECLARE 
    does_not_exist EXCEPTION; 
    PRAGMA EXCEPTION_INIT (does_not_exist, -942); 
BEGIN 
    EXECUTE IMMEDIATE 'DROP TABLE foobar'; 
EXCEPTION 
    WHEN does_not_exist 
    THEN 
     NULL; 
END; 
/

CREATE TABLE foobar (c1 INT); 

이 기능을 수행하기위한 적절한 방법이 있습니까?

+0

시도한 내용에 따라 임시 테이블이 유용 할 수 있습니다. –

+0

아니, 내가 임시 테이블이 아닌 테이블을 사용해야합니다. 그러나 당신의 제안에 감사드립니다. – kuldarim

+0

나는 이걸 결코 이해하지 못했다. 그냥 표를 버리십시오. – haki

답변

5

글로벌 주소 temporary table을 사용하는 것이 더 좋은 옵션 인 것 같습니다. 그러나 런타임에 테이블 삭제 및 다시 추가를 원하면 _TABLES 뷰 중 하나 (예 : USER_TABLES, DBA_TABLES, ALL_TABLES)를 쿼리하여 테이블이 존재하는지 확인한 다음 테이블이 있으면 삭제하고 생성하십시오.

SELECT COUNT(*) 
    INTO nCount 
    FROM USER_TABLES 
    WHERE TABLE_NAME = 'FOOBAR'; 

IF nCount <> 0 THEN 
    EXECUTE IMMEDIATE 'DROP TABLE FOOBAR'; 
END IF; 

EXECUTE IMMEDIATE 'CREATE TABLE FOOBAR(...)'; 

공유하고 즐기십시오.

+0

@ 벤 - 1 분이면 나를 이길 수 있습니다! –

9

PL/SQL에서이 작업을 수행하면 안됩니다. 런타임에 작성된 테이블은 데이터 모델의 결함을 나타냅니다. 정말로 확신이 있다면 반드시 먼저 temporary tables을 조사하십시오. 개인적으로, 나는 그것이 필요하다는 것을 재평가 할 것입니다.

this question에 대한 몇 가지 대답에 설명되어있는 EAFP as opposed to LBYL 접근 방법에있는 것처럼 보입니다. 나는 이것이 불필요하다고 주장 할 것이다. 테이블은 꽤 정적 인 짐승입니다. 시스템보기 USER_TABLES을 사용하여 테이블을 삭제하기 전에 존재 여부를 확인할 수 있습니다.

declare 

    l_ct number; 

begin 

    -- Determine if the table exists. 
    select count(*) into l_ct 
    from user_tables 
    where table_name = 'THE_TABLE'; 

    -- Drop the table if it exists. 
    if l_ct = 1 then 
     execute immediate 'drop table the_table'; 
    end if; 

    -- Create the new table it either didn-t exist or 
    -- has been dropped so any exceptions are exceptional. 
    execute immediate 'create table the_table (...)'; 

end; 
/
+0

감사합니다. Ben, 저는 런타임시 테이블을 다시 만드는 것이 좋지 않은 접근 방법이지만, 저에게 주어진 작업을 수행해야한다는 것을 알고 있습니다. – kuldarim

관련 문제