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.

War es hilfreich?

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 (...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top