Come si usa CREATE OR REPLACE?


98

Ho ragione nel capire che CREATE OR REPLACE significa fondamentalmente "se l'oggetto esiste, rilascialo, quindi crealo in un modo o nell'altro?"

In tal caso, cosa sto facendo di sbagliato? Funziona:

CREATE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

E questo non (ORA-00922: opzione mancante o non valida):

CREATE OR REPLACE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

Sto facendo qualcosa di stupido? Non mi sembra di essere in grado di trovare molta documentazione su questa sintassi.

Risposte:


154

Funziona su funzioni, procedure, pacchetti, tipi, sinonimi, trigger e visualizzazioni.

Aggiornare:

Dopo aver aggiornato il post per la terza volta, riformulerò questo:

Questo non funziona sui tavoli :)

E sì, c'è documentazione su questa sintassi e non ci sono REPLACEopzioni per CREATE TABLE.


33

Una delle cose belle della sintassi è che puoi essere sicuro che a CREATE OR REPLACEnon ti farà mai perdere dati (il massimo che perderai è il codice, che si spera avrai memorizzato da qualche parte nel controllo del codice sorgente).

La sintassi equivalente per le tabelle è ALTER, il che significa che devi enumerare esplicitamente le modifiche esatte richieste.

EDIT: A proposito, se hai bisogno di fare un DROP + CREATE in uno script e non ti interessano gli errori spuri "l'oggetto non esiste" (quando DROP non trova la tabella), puoi farlo Questo:

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; END IF;
END;
/

23

Non esiste alcuna tabella di creazione o sostituzione in Oracle.

Devi:

DROP TABLE foo;
CREA TABELLA pippo (....);

10

CREATE OR REPLACE può essere utilizzato solo su funzioni, procedure, tipi, viste o pacchetti - non funzionerà sulle tabelle.


1
CREATE OR REPLACEfunziona anche per sinonimi e trigger
Richard Mitchell

4

Il seguente script dovrebbe fare il trucco su Oracle:

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;


3

Una procedura utile per i database Oracle senza utilizzare eccezioni (in circostanze è necessario sostituire user_tables con dba_tables e / o vincolare lo spazio tabella nella query):

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;
/

Un po 'più di codice rispetto ad altri esempi, ma anche un po' più chiaro nel suo scopo
grokster

1

Se stai facendo nel codice, controlla prima la tabella nel database usando la query SELECT nome_tabella FROM tabelle_utente WHERE nome_tabella = 'XYZ'

se il record viene trovato, tronca la tabella altrimenti crea la tabella

Funziona come Crea o Sostituisci.


1

Puoi usare CORT ( www.softcraftltd.co.uk/cort ). Questo strumento consente di CREARE O SOSTITUIRE una tabella in Oracle. Sembra:

create /*# or replace */ table MyTable(
  ... -- standard table definition
);

Conserva i dati.


1

Quindi l'ho usato e ha funzionato molto bene: - Funziona più come un DROP SE ESISTE ma fa il lavoro

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;
/   

Spero che questo aiuti anche Riferimento: PLS-00103 Errore in PL / SQL Developer


1

"Crea o sostituisci tabella" non è possibile. Come altri hanno affermato, puoi scrivere una procedura e / o usare start execute immediatamente (...). Poiché non vedo una risposta su come (ri) creare la tabella, ho inserito uno script come risposta.

PS: in linea con quanto menzionato da jeffrey-kemp: questo sotto lo script NON salverà i dati che sono già presenti nella tabella che stai per eliminare. A causa del rischio di perdita di dati, nella nostra azienda è consentito modificare solo le tabelle esistenti nell'ambiente di produzione e non è consentito eliminare le tabelle. Utilizzando l'istruzione drop table, prima o poi avrai la polizia aziendale in piedi alla tua scrivania.

--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;

Devi essere coerente con A_TABLE_EXAMPLE e A_TABLE_X?
Jonathan Leffler

0

Farei qualcosa di simile

  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

Se questo è per MS SQL .. Il codice seguente verrà sempre eseguito indipendentemente dal fatto che la tabella esista già o meno.

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
Scusa, ma questo è Oracle. :-)
Jason Baker

il commento "// ci sono dati nella tabella" è accurato?
Jeffrey Kemp,

scusate un po 'meglio, object_id controlla se la tabella esiste nel db. dovrebbe dire // la tabella è già stata creata nel db
JuniorFlip
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.