CREATE OR REPLACE는 어떻게 사용합니까?


98

CREATE OR REPLACE는 기본적으로 "객체가 존재하는 경우 삭제 한 다음 어느 쪽이든 생성"을 의미한다는 것을 이해하고있는 것이 맞습니까?

그렇다면 내가 뭘 잘못하고 있니? 이것은 작동합니다 :

CREATE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

그리고 이것은 (ORA-00922 : 누락되거나 유효하지 않은 옵션) :

CREATE OR REPLACE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

내가 멍청한 짓을하고 있니? 이 구문에 대한 많은 문서를 찾을 수없는 것 같습니다.

답변:


153

이것은 함수, 프로 시저, 패키지, 유형, 동의어, 트리거 및보기에서 작동합니다.

최신 정보:

세 번째로 게시물을 업데이트 한 후 다음을 다시 수정하겠습니다.

이것은 테이블에서 작동하지 않습니다. :)

그리고 네,이 문서를 이 구문에, 그리고 더 없다 REPLACE에 대한 옵션 CREATE TABLE.


33

구문의 좋은 점 중 하나는 a로 CREATE OR REPLACE인해 데이터 손실이 발생하지 않는다는 것입니다 (손실되는 대부분은 소스 제어 어딘가에 저장 한 코드입니다).

테이블에 해당하는 구문은 ALTER이며, 이는 필요한 정확한 변경 사항을 명시 적으로 열거해야 함을 의미합니다.

편집 : 그건 그렇고, 스크립트에서 DROP + CREATE를 수행해야하고 가상 "개체가 존재하지 않습니다"오류 (DROP이 테이블을 찾지 못하는 경우)에 대해 신경 쓰지 않는다면 할 수 있습니다. 이:

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; END IF;
END;
/

23

Oracle에는 생성 또는 교체 테이블이 없습니다.

다음을 수행해야합니다.

드롭 테이블 foo;
테이블 생성 foo (....);

10

CREATE OR REPLACE 함수, 프로 시저, 유형,보기 또는 패키지에서만 사용할 수 있으며 테이블에서는 작동하지 않습니다.


1
CREATE OR REPLACE동의어 및 트리거 작동
리처드 미첼

4

다음 스크립트는 Oracle에서 트릭을 수행해야합니다.

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;

3

테이블, 함수 등에서 만 작동합니다.

다음은 몇 가지 예가 있는 사이트입니다 .


3

예외를 사용하지 않고 Oracle 데이터베이스에 유용한 절차 (상황에서 user_tables를 dba_tables로 바꾸거나 쿼리에서 테이블 스페이스를 제한해야 함) :

create or replace procedure NG_DROP_TABLE(tableName varchar2)
is
   c int;
begin
   select count(*) into c from user_tables where table_name = upper(tableName);
   if c = 1 then
      execute immediate 'drop table '||tableName;
   end if;
end;

3
-- To Create or Replace a Table we must first silently Drop a Table that may not exist
DECLARE
  table_not_exist EXCEPTION;
  PRAGMA EXCEPTION_INIT (table_not_exist , -00942);
BEGIN
   EXECUTE IMMEDIATE('DROP TABLE <SCHEMA>.<TABLE NAME> CASCADE CONSTRAINTS');
   EXCEPTION WHEN table_not_exist THEN NULL;
END;
/

다른 예제보다 코드가 조금 더 많지만 그 목적도 좀 더 명확합니다
grokster

1

코드에서 수행하는 경우 먼저 SELECT table_name FROM user_tables WHERE table_name = 'XYZ'쿼리를 사용하여 데이터베이스의 테이블을 확인하십시오.

레코드가 발견되면 테이블을 자르고 그렇지 않으면 테이블을 만듭니다.

만들기 또는 바꾸기처럼 작동합니다.


1

CORT ( www.softcraftltd.co.uk/cort )를 사용할 수 있습니다 . 이 도구를 사용하면 Oracle에서 테이블을 생성 또는 교체 할 수 있습니다. 다음과 같이 보입니다.

create /*# or replace */ table MyTable(
  ... -- standard table definition
);

데이터를 보존합니다.


1

그래서 저는 이것을 사용해 왔으며 매우 잘 작동했습니다.-DROP IF EXISTS처럼 작동하지만 작업이 완료됩니다.

DECLARE
       VE_TABLENOTEXISTS EXCEPTION;
PRAGMA EXCEPTION_INIT(VE_TABLENOTEXISTS, -942);


    PROCEDURE DROPTABLE(PIS_TABLENAME IN VARCHAR2) IS
              VS_DYNAMICDROPTABLESQL VARCHAR2(1024);
                    BEGIN
                       VS_DYNAMICDROPTABLESQL := 'DROP TABLE ' || PIS_TABLENAME;  
                    EXECUTE IMMEDIATE VS_DYNAMICDROPTABLESQL;

                    EXCEPTION
                        WHEN VE_TABLENOTEXISTS THEN
                             DBMS_OUTPUT.PUT_LINE(PIS_TABLENAME || ' NOT EXIST, SKIPPING....');
                        WHEN OTHERS THEN
                             DBMS_OUTPUT.PUT_LINE(SQLERRM);
                    RAISE;
                    END DROPTABLE;

    BEGIN
      DROPTABLE('YOUR_TABLE_HERE');
END DROPTABLE;
/   

이 정보가 도움이 되었기를 바랍니다 . 참조 : PL / SQL 개발자의 PLS-00103 오류


1

'테이블 생성 또는 교체'가 불가능합니다. 다른 사람들이 언급했듯이 프로 시저를 작성하거나 즉시 실행 시작 (...)을 사용할 수 있습니다. 표를 (재) 만드는 방법에 대한 답이 보이지 않기 때문에 스크립트를 답으로 넣었습니다.

추신 : jeffrey-kemp가 언급 한 내용에 따라 : 아래 스크립트는 삭제하려는 테이블에 이미있는 데이터를 저장하지 않습니다. 데이터 손실의 위험이 있기 때문에 우리 회사에서는 프로덕션 환경에서 기존 테이블 만 변경할 수 있으며 테이블 삭제는 허용되지 않습니다. 드롭 테이블 진술을 사용하면 조만간 회사 경찰이 책상에 서게 될 것입니다.

--Create the table 'A_TABLE_X', and drop the table in case it already is present
BEGIN
EXECUTE IMMEDIATE 
'
CREATE TABLE A_TABLE_X
(
COLUMN1 NUMBER(15,0),
COLUMN2  VARCHAR2(255 CHAR),
COLUMN3  VARCHAR2(255 CHAR)
)';

EXCEPTION
WHEN OTHERS THEN
  IF SQLCODE != -955 THEN -- ORA-00955: object name already used
     EXECUTE IMMEDIATE 'DROP TABLE A_TABLE_X';
  END IF;
END;

A_TABLE_EXAMPLE 및 A_TABLE_X와 일치해야합니까?
Jonathan Leffler

0

나는 이렇게 할 것이다

  begin
     for i in (select table_name from user_tables where table_name = 'FOO') loop
        execute immediate 'drop table '||i.table_name;
     end loop;
  end;

  execute immediate 'CREATE TABLE FOO (id NUMBER,
                                       title VARCHAR2(4000)) ';

-4

MS SQL의 경우 .. 테이블이 이미 존재하는지 여부에 관계없이 다음 코드는 항상 실행됩니다.

if object_id('mytablename') is not null //has the table been created already in the db
Begin
     drop table mytablename
End

Create table mytablename (...

1
죄송합니다. 이것은 Oracle입니다. :-)
Jason Baker

"//이 테이블에 데이터가 있습니까"라는 주석이 정확합니까?
Jeffrey Kemp

조금 더 죄송합니다. object_id는 테이블이 db에 있는지 확인합니다. 이 테이블은 DB에 이미 생성 된 // 말해야한다
JuniorFlip
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.