2013-03-26 13 views
17

Próba sprawdzenia, czy tabela istnieje przed utworzeniem w Oracle. Wyszukaj także większość postów od Stackoverflow i innych. Znajdź zapytanie, ale nie zadziałało.Tabela sprawdzająca istnieje, lub nie wcześniej, utwórz ją w 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; 

Który daje mi błąd

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

ja wyszukiwania dla składni dla IF stanie, myślę, który jest również pisać. Proszę sugerują mnie ....

+0

Musisz umieścić to w bloku PL/SQL. – Thilo

+3

W skryptach Oracle dość często można spróbować utworzyć tabelę, a następnie przechwycić wyjątek, jeśli tabela już istnieje. – Rene

Odpowiedz

18

Jak Rene skomentował również, że to dość rzadkością, aby najpierw sprawdzić, a następnie utworzyć tabelę. Jeśli chcesz mieć kod działający według wybranej metody, to będzie:

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; 

Ale wolałbym iść połowu na wyjątek, oszczędza niepotrzebne wiersze kodu:

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

Spróbuj:

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

Chcesz sprawdzić, czy tabela istnieje w określonym schemacie. – Rene

+0

To daje miano ORA-00922: brakujący lub nieprawidłowy błąd opcji ... – 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

Wiem, że ten temat jest nieco stary, ale myślę, że zrobiłem coś, co może być przydatne dla kogoś, więc zamieszczam go.

Skompilowałem sugestie odpowiedzi Ten wątek jest do procedury:

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; 

można następnie wykorzystać je w następujący sposób:

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

Wiem, że to trochę zbędne przekazać nazwę tabeli dwukrotnie , ale myślę, że to jest najłatwiejsze.

Mam nadzieję, że ktoś znajdzie powyżej :-).

Powiązane problemy