Programing

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

lottogame 2020. 9. 2. 20:36
반응형

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


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

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


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

최신 정보:

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

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

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


구문의 좋은 점 중 하나는 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;
/

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

다음을 수행해야합니다.

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

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


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

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
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;

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

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

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

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


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

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

데이터를 보존합니다.


그래서 저는 이것을 사용해 왔으며 매우 잘 작동했습니다.-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;
/   

Hope this helps Also reference: PLS-00103 Error in PL/SQL Developer


'Create or replace table' is not possible. As others stated, you can write a procedure and/or use begin execute immediately (...). Because I don't see an answer with how to (re)create the table, I putted a script as an answer.

PS: in line of what jeffrey-kemp mentioned: this beneath script will NOT save data that is already present in the table you are going to drop. Because of the risk of loosing data, at our company it is only allowed to alter existing tables on the production environment, and it is not allowed to drop tables. By using the drop table statement, sooner or later you will get the company police standing at your desk.

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

If this is for MS SQL.. The following code will always run no matter what if the table exist already or not.

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

Create table mytablename (...

참고URL : https://stackoverflow.com/questions/1008248/how-do-i-use-create-or-replace

반응형