Wie verwende ich CREATE OR REPLACE?
Frage
Bin ich Verständnis korrigieren, die im Grunde CREATE OR REPLACE bedeutet „wenn das Objekt vorhanden ist, legen Sie es, es dann so oder so schaffen?“
Wenn ja, was mache ich falsch? Dies funktioniert:
CREATE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')
Und dies nicht (ORA-00922: fehlende oder ungültige Option):
CREATE OR REPLACE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')
Mache ich etwas dumm? Ich habe nicht in der Lage sein scheinen viel Dokumentation über diese Syntax zu finden.
Lösung
Dies funktioniert auf Funktionen, Prozeduren, Pakete, Typen, Synonyme, Trigger und Views.
Update:
, um den Beitrag zum dritten Mal nach dem Update, ich werde diese umformulieren:
Das funktioniert nicht auf Tabellen:)
Und ja, es ist Dokumentation auf dieser Syntax, und es gibt keine REPLACE
Option für CREATE TABLE
.
Andere Tipps
Eines der schönen Dinge über die Syntax ist, dass man sicher sein kann, dass ein CREATE OR REPLACE
werden Sie nie dazu führen, Daten zu verlieren (die Sie verlieren Code ist, was werden Sie hoffentlich irgendwo in der Quellcodeverwaltung gespeichert haben).
Die äquivalente Syntax für Tabellen ist ALTER, das heißt, Sie müssen explizit die genauen Änderungen aufzuzählen, die erforderlich sind.
EDIT: By the way, müssen, wenn Sie eine DROP tun + in ein Skript erstellen, und Sie kümmern sich nicht für die falsche „Objekt existiert nicht“ Fehler (wenn die DROP die Tabelle nicht finden), können Sie dies tun:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
WHEN OTHERS THEN
IF sqlcode != -0942 THEN RAISE; END IF;
END;
/
Es gibt kein erstellen oder Tabelle in Oracle ersetzen.
Sie müssen:
DROP TABLE foo; CREATE TABLE foo (....);
CREATE OR REPLACE
kann nur auf Funktionen, Prozeduren, Typen, Ansichten verwendet werden, oder Pakete - es wird nicht auf Tabellen arbeiten
Skript Nach sollte den Trick auf Oracle tun:
BEGIN
EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
WHEN OTHERS THEN
IF sqlcode != -0942 THEN RAISE;
END IF;
END;
Funktioniert nicht mit Tabellen, nur Funktionen etc.
Hier ist eine Website mit einigen Beispiele .
-- 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;
/
Ein nützliches Verfahren für Oracle-Datenbanken ohne Ausnahmen zu verwenden (unter Umständen Sie ersetzen müssen user_tables mit dba_tables und / oder dem Tabellenbereich in der Abfrage beschränken):
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;
Wenn Sie in Code tun dann zuerst für die Tabelle überprüft in Datenbank durch Abfrage SELECT table_name VON user_tables WHERE table_name = 'XYZ'
Wenn Datensatz gefunden dann gestutzt Tabelle sonst Tabelle erstellen
Arbeits wie erstellen oder ersetzen.
Sie können mit CORT ( www.softcraftltd.co.uk/cort ). Dieses Tool ermöglicht Tabelle in Oracle CREATE OR REPLACE. Es sieht aus wie:
create /*# or replace */ table MyTable(
... -- standard table definition
);
Es bewahrt Daten.
Also habe ich mit diesem worden, und es hat sehr gut funktioniert: - es ist wie ein Tropfen funktioniert, wenn vorhanden, aber erhält die Arbeit erledigt
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, das hilft Referenz: PLS-00103 Fehler in PL / SQL Developer
‚Erstellen oder ersetzen Tabelle‘ ist nicht möglich. Wie andere erwähnt, können Sie ein Verfahren und / oder ausführen schreiben bitte sofort beginnen (...). Weil ich keine Antwort mit sehen, wie die Tabelle zu (re) erstellen, ich geputtet ein Skript als Antwort.
PS: in Zeile von dem, was jeffrey-kemp erwähnt: Die unter Skript keine Daten speichern, die in der Tabelle bereits vorhanden ist, Sie gehen zu fallen. Aufgrund der Risikodaten zu verlieren, bei uns ist es nur vorhandene Tabellen auf der Produktionsumgebung zu verändern erlaubt, und es ist nicht zu fallen Tabellen erlaubt. Durch den Einsatz erhält die Drop table-Anweisung, früher oder später die Firma Polizei an Ihrem Schreibtisch steht.
--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;
Wenn dies für MS SQL ist .. Der folgende Code wird immer egal laufen, was, wenn die Tabelle bereits vorhanden ist oder nicht.
if object_id('mytablename') is not null //has the table been created already in the db
Begin
drop table mytablename
End
Create table mytablename (...