[sql] Oracle: se la tabella esiste



Answers

declare
   c int;
begin
   select count(*) into c from user_tables where table_name = upper('table_name');
   if c = 1 then
      execute immediate 'drop table table_name';
   end if;
end;

Questo serve per verificare se esiste una tabella nello schema corrente. Per verificare se una tabella specifica esiste già in uno schema diverso, dovresti usare all_tables invece di user_tables e aggiungere la condizione all_tables.owner = upper('schema_name')

Question

Sto scrivendo alcuni script di migrazione per un database Oracle e speravo che Oracle avesse qualcosa di simile al costrutto IF EXISTS di MySQL.

Nello specifico, ogni volta che voglio rilasciare una tabella in MySQL, faccio qualcosa di simile

DROP TABLE IF EXISTS `table_name`;

In questo modo, se la tabella non esiste, il DROP non produce un errore e lo script può continuare.

Oracle ha un meccanismo simile? Mi rendo conto che potrei usare la seguente interrogazione per verificare se esiste una tabella o meno

SELECT * FROM dba_tables where table_name = 'table_name';

ma la sintassi per legare che insieme a un DROP mi sfugge.




Puoi sempre prendere l'errore da solo.

begin
execute immediate 'drop table mytable';
exception when others then null;
end;

È considerata una cattiva pratica abusare di questo, simile a vuoto catch () in altre lingue.

Saluti
K




volevo solo pubblicare un codice completo che crei una tabella e rilasciarla se esiste già usando il codice di Jeffrey (complimenti per lui, non per me!).

BEGIN
    BEGIN
         EXECUTE IMMEDIATE 'DROP TABLE tablename';
    EXCEPTION
         WHEN OTHERS THEN
                IF SQLCODE != -942 THEN
                     RAISE;
                END IF;
    END;

    EXECUTE IMMEDIATE 'CREATE TABLE tablename AS SELECT * FROM sourcetable WHERE 1=0';

END;



BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE "IMS"."MAX" ';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
          END IF;
         EXECUTE IMMEDIATE ' 
  CREATE TABLE "IMS"."MAX" 
   (    "ID" NUMBER NOT NULL ENABLE, 
    "NAME" VARCHAR2(20 BYTE), 
     CONSTRAINT "MAX_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSAUX"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSAUX"  ';


END;

// Eseguendo questo codice, controlla se la tabella esiste e successivamente crea la tabella max. questo funziona semplicemente in una singola compilation




Un modo è utilizzare DBMS_ASSERT.SQL_OBJECT_NAME :

Questa funzione verifica che la stringa del parametro di input sia un identificatore SQL qualificato di un oggetto SQL esistente.

DECLARE
    V_OBJECT_NAME VARCHAR2(30);
BEGIN
   BEGIN
        V_OBJECT_NAME  := DBMS_ASSERT.SQL_OBJECT_NAME('tab1');
        EXECUTE IMMEDIATE 'DROP TABLE tab1';

        EXCEPTION WHEN OTHERS THEN NULL;
   END;
END;
/

Demo di DBFiddle




Un blocco come questo potrebbe esserti utile.

DECLARE
    table_exist INT;

BEGIN
    SELECT Count(*)
    INTO   table_exist
    FROM   dba_tables
    WHERE  owner = 'SCHEMA_NAME' 
    AND table_name = 'EMPLOYEE_TABLE';

    IF table_exist = 1 THEN
      EXECUTE IMMEDIATE 'drop table EMPLOYEE_TABLE';
    END IF;
END;  



Non c'è nessun 'DROP TABLE SE EXISTS' in oracle, dovresti fare la select statement.

prova questo (non sono in sintassi oracle, quindi se le mie variabili sono ify, per favore perdonami):

declare @count int
select @count=count(*) from all_tables where table_name='Table_name';
if @count>0
BEGIN
    DROP TABLE tableName;
END



Related