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

これは、関数、プロシージャ、パッケージ、タイプ、シノニム、トリガー、およびビューで機能します。

更新:

3回目の投稿の更新後、これを再定式化します。

これはテーブルでは機能しません:)

そして、はい、この構文に関するドキュメントがあり、のREPLACEオプションはありませんCREATE TABLE


33

構文の良い点の1つは、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にはテーブルの作成または置換はありません。

絶対です:

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

10

CREATE OR REPLACE 関数、プロシージャ、タイプ、ビュー、またはパッケージでのみ使用できます-テーブルでは機能しません。


1
CREATE OR REPLACE同義語やトリガーでも機能します
Richard Mitchell 14

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 DeveloperのPLS-00103エラー


1

「テーブルの作成または置換」はできません。他の人が述べたように、プロシージャを記述したり、すぐに実行開始(...)を使用したりできます。テーブルを(再)作成する方法についての回答が見当たらないため、スクリプトを回答として追加しました。

PS: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 2017年

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

「//テーブルにデータがあります」というコメントは正確ですか?
ジェフリーケンプ、

少し申し訳ありませんが、object_idはテーブルがデータベースに存在するかどうかを確認します。//テーブルはすでにdbに作成されています
JuniorFlip
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.