2013-03-26 1 views
17

Tentare di verificare la tabella esiste prima di crearla in Oracle. Cerca la maggior parte dei post di Stackoverflow e anche altri. Trova qualche domanda ma non ha funzionato per me.La tabella di controllo esiste o meno prima di crearla in Oracle

IF((SELECT count(*) FROM dba_tables where table_name = 'EMPLOYEE') <= 0) 
THEN 
create table EMPLOYEE 
(
ID NUMBER(3), 
NAME VARCHAR2(30) NOT NULL 
) 
END IF; 

che mi dà errore

Error: ORA-00900: invalid SQL statement 
SQLState: 42000 
ErrorCode: 900 
Position: 1 

Cerco la sintassi per IF condizioni, penso che è anche scrivere. Si prega di suggerire me ....

+0

È necessario inserirlo in un blocco PL/SQL. – Thilo

+3

È piuttosto comune negli script Oracle cercare di creare la tabella e quindi rilevare l'eccezione se la tabella esiste già. – Rene

risposta

18

Come Rene anche commentato, è abbastanza raro per controllare e poi creare la tabella. Se si desidera avere un codice in esecuzione in base al metodo, questo sarà:

declare 
nCount NUMBER; 
v_sql LONG; 

begin 
SELECT count(*) into nCount FROM dba_tables where table_name = 'EMPLOYEE'; 
IF(nCount <= 0) 
THEN 
v_sql:=' 
create table EMPLOYEE 
(
ID NUMBER(3), 
NAME VARCHAR2(30) NOT NULL 
)'; 
execute immediate v_sql; 

END IF; 
end; 

ma preferirei andare fermo sul Exception, consente di risparmiare alcune righe non necessarie di codice:

declare 
v_sql LONG; 
begin 

v_sql:='create table EMPLOYEE 
    (
    ID NUMBER(3), 
    NAME VARCHAR2(30) NOT NULL 
)'; 
execute immediate v_sql; 

EXCEPTION 
    WHEN OTHERS THEN 
     IF SQLCODE = -955 THEN 
     NULL; -- suppresses ORA-00955 exception 
     ELSE 
     RAISE; 
     END IF; 
END; 
/
1

Si prega di provare:

SET SERVEROUTPUT ON 
DECLARE 
v_emp int:=0; 
BEGIN 
    SELECT count(*) into v_emp FROM dba_tables where table_name = 'EMPLOYEE'; 

    if v_emp<=0 then 
    EXECUTE IMMEDIATE 'create table EMPLOYEE (ID NUMBER(3), NAME VARCHAR2(30) NOT NULL)'; 
    end if; 
END; 
+2

Si desidera verificare se la tabella esiste in uno schema specifico. – Rene

+0

Ciò dà al miagolio ORA-00922: errore di opzione mancante o non valido ... – Navnath

0
declare n number(10); 

begin 
    select count(*) into n from tab where tname='TEST'; 

    if (n = 0) then 
     execute immediate 
     'create table TEST (ID NUMBER(3), NAME VARCHAR2 (30) NOT NULL)'; 
    end if; 
end; 
1

So che questo argomento è un po 'vecchio, ma penso di aver fatto qualcosa che potrebbe essere utile a qualcuno, quindi lo sto postando.

ho compilato suggerimenti da risposte di questa discussione in una procedura:

CREATE OR REPLACE PROCEDURE create_table_if_doesnt_exist(
    p_table_name VARCHAR2, 
    create_table_query VARCHAR2 
) AUTHID CURRENT_USER IS 
    n NUMBER; 
BEGIN 
    SELECT COUNT(*) INTO n FROM user_tables WHERE table_name = UPPER(p_table_name); 
    IF (n = 0) THEN 
    EXECUTE IMMEDIATE create_table_query; 
    END IF; 
END; 

è possibile utilizzare in un modo seguente:

call create_table_if_doesnt_exist('my_table', 'CREATE TABLE my_table (
     id NUMBER(19) NOT NULL PRIMARY KEY, 
     text VARCHAR2(4000), 
     modified_time TIMESTAMP 
)' 
); 

so che è un pò ridondante per passare il nome della tabella due volte , ma penso che sia il più facile qui.

Spero che qualcuno trovi utile sopra :-).