Domanda

Sono corretto nel capire che CREARE O SOSTITUIRE sostanzialmente significa "se l'oggetto esiste, rilasciarlo, quindi crearlo in entrambi i modi?"

In tal caso, cosa sto facendo di sbagliato? Questo funziona:

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

E questo non funziona (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 riesco a trovare molta documentazione su questa sintassi.

È stato utile?

Soluzione

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

Aggiornamento:

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

  

Questo non funziona sulle tabelle :)

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

Altri suggerimenti

Una delle cose belle della sintassi è che puoi essere sicuro che un CREA O SOSTITUISCI non ti farà mai perdere dati (il massimo che perderai è il codice, che spero archiviato nel controllo del codice sorgente da qualche parte).

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

Modifica A proposito, se devi eseguire un DROP + CREATE in uno script e non ti interessa l'oggetto spurio " non esiste " errori (quando il DROP non trova la tabella), puoi farlo:

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

Non esiste una tabella di creazione o sostituzione in Oracle.

Devi:

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

CREA O SOSTITUI può essere utilizzato solo su funzioni, procedure, tipi, viste o pacchetti - non funzionerà su tabelle.

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;

Non funziona con tabelle, solo funzioni ecc.

Ecco un sito con alcuni esempi .

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

Una procedura utile per i database Oracle senza utilizzare eccezioni (in circostanze è necessario sostituire user_tables con dba_tables e / o vincolare il tablespace 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;

Se stai eseguendo il codice, controlla prima la tabella nel database usando query  SELEZIONA table_name   DA user_tables  DOVE table_name = 'XYZ'

se il record è stato trovato, tronca la tabella, altrimenti crea la tabella

Funziona come Crea o Sostituisci.

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

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

Conserva i dati.

Quindi sto usando questo 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: Errore PLS-00103 nello sviluppatore PL / SQL

'Crea o sostituisci tabella' non è possibile. Come altri hanno già detto, è possibile scrivere una procedura e / o usare inizia eseguire 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 script sottostante NON salverà i dati che sono già presenti nella tabella che stai per eliminare. A causa del rischio di perdere dati, nella nostra azienda è consentito modificare solo le tabelle esistenti nell'ambiente di produzione e non è consentito eliminare le tabelle. Usando la dichiarazione della tabella di rilascio, prima o poi avrai la polizia della compagnia in piedi sulla 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;

Se questo è per MS SQL .. Il seguente codice 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 (...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top