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
'Programing' 카테고리의 다른 글
프로그래밍 방식으로 자산 카탈로그 액세스 (0) | 2020.09.03 |
---|---|
파일이 x보다 오래 전에 생성되었는지 bash에서 어떻게 확인합니까? (0) | 2020.09.02 |
제출시 양식 리디렉션 또는 새로 고침을 방지 하시겠습니까? (0) | 2020.09.02 |
사전에 추가하는 다양한 방법 (0) | 2020.09.02 |
파일의 MIME 유형 (Content-Type)을 어떻게 찾을 수 있습니까? (0) | 2020.09.02 |