문제

기본적으로 "객체가 존재하는 경우 삭제 한 다음 어느 쪽이든 만들어 놓은"것을 의미 하는가?

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

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')

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

도움이 되었습니까?

해결책

기능, 절차, 패키지, 유형, 동의어, 트리거 및 뷰에서 작동합니다.

업데이트:

게시물을 세 번째로 업데이트 한 후에는 다음을 재구성하겠습니다.

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

그리고 그렇습니다 선적 서류 비치 이 구문에는 아니요 REPLACE 옵션 CREATE TABLE.

다른 팁

구문의 좋은 점 중 하나는 CREATE OR REPLACE 데이터를 잃지 않을 것입니다 (가장 많이 잃게 될 것입니다. 코드는 소스 제어에 어딘가에 저장되기를 바랍니다).

테이블의 동등한 구문은 변경되므로 필요한 정확한 변경 사항을 명시 적으로 열거해야합니다.

편집하다:그건 그렇고, 스크립트에서 Drop + Create를 수행해야하고 가짜 "객체가 존재하지 않는"오류를 신경 쓰지 않으면 (드롭이 테이블을 찾지 못하면)이를 수행 할 수 있습니다.

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

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

당신은 :

DROP TABLE foo;
CREATE TABLE foo (....);

CREATE OR REPLACE 함수, 절차, 유형, 뷰 또는 패키지에만 사용할 수 있습니다. 테이블에서는 작동하지 않습니다.

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

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

테이블과 함께 작동하지 않고 기능 만 작동합니다.

여기에 일부 사이트가 있습니다 .

-- 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;
/

예의를 사용하지 않고 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;

코드에서 수행중인 경우 먼저 Query를 사용하여 데이터베이스에서 테이블을 확인하십시오.

레코드가 발견되면 테이블을 잘라냅니다. 그렇지 않으면 테이블을 만듭니다

생성 또는 교체와 같은 작업.

Cort를 사용할 수 있습니다 (www.softcraftltd.co.uk/cort). 이 도구를 사용하면 Oracle에서 테이블을 만들거나 교체 할 수 있습니다. 그것은 다음과 같습니다.

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

데이터가 보존됩니다.

그래서 나는 이것을 사용해 왔고 그것은 매우 잘 작동했습니다 : - 존재한다면 드롭처럼 작동하지만 작업을 완료합니다.

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 오류

'테이블 작성 또는 교체'는 불가능합니다. 다른 사람들이 언급했듯이 절차를 작성하거나 즉시 실행을 시작할 수 있습니다 (...). 테이블을 만드는 방법에 대한 답이 없기 때문에 대본을 대답으로 넣었습니다.

추신 : 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;

이것이 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 (...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top