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')
バカなことをしていますか?この構文に関する多くのドキュメントを見つけることができないようです。
これは、関数、プロシージャ、パッケージ、タイプ、同義語、トリガー、ビューで機能します。
更新:
投稿を3回更新した後、これを再定式化します。
これはテーブルでは機能しません:)
はい、この構文には documentation があり、CREATE TABLE
のREPLACE
オプションはありません。
構文の良い点の1つは、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にはテーブルの作成または置換はありません。
絶対です:
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;
/
テーブルでは機能せず、機能などのみ.
ここにいくつかの examples があるサイトがあります。
例外を使用しない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;
CORTを使用できます( www.softcraftltd.co.uk/cort )。このツールを使用すると、OracleでOR REPLACEテーブルを作成できます。次のようになります。
create /*# or replace */ table MyTable(
... -- standard table definition
);
データを保存します。
コードで実行している場合は、最初にクエリSELECT table_name FROM user_tables WHERE table_name = 'XYZ'を使用してデータベース内のテーブルをチェックします
レコードが見つかった場合はテーブルを切り捨て、そうでない場合はテーブルを作成します
作成または置換のように動作します。
だから私はこれを使用してきましたが、非常にうまく機能しました。
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;
/
これが参考になることを願っています: PLS-00103 PL/SQL Developerのエラー
「テーブルの作成または置換」はできません。他の人が述べたように、プロシージャを記述したり、すぐにbegin executeを使用したりできます(...)。テーブルを(再)作成する方法についての答えが表示されないため、答えとしてスクリプトを入れました。
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;