2013-03-26 158 views
17

在Oracle中創建之前試圖檢查是否存在表。搜索Stackoverflow和其他人的大部分帖子。找到一些查詢,但它不適合我。在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; 

這給了我錯誤

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

我搜索語法IF條件,我想這也是寫。 請建議我....

+0

你需要把它放到一個PL/SQL塊中。 – Thilo 2013-03-26 06:34:52

+3

在Oracle腳本中,僅嘗試創建表並在表已存在的情況下捕獲異常是很常見的。 – Rene 2013-03-26 08:19:33

回答

18

正如劉若英還評價說,這是相當罕見的第一次檢查,然後創建表。 如果你想擁有按你的方法正在運行的代碼,這將是:

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; 

但我寧願去對異常俘獲,可以節省你的代碼一些不必要的行:

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

請嘗試:

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

您想檢查表是否存在於特定模式中。 – Rene 2013-03-26 07:25:52

+0

這給了我新的ORA-00922:缺失或無效的選項錯誤... – Navnath 2013-03-26 10:35:28

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

我知道這個話題有點舊,但我想我做了一些對某人有用的東西,所以我發佈了它。從這個線程的答案

我編的建議納入一個過程:

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; 

然後,您可以使用它的方式如下:

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

我知道它有點多餘的傳遞表名稱兩次,但我認爲這是最簡單的。

希望有人發現上面有用:-)。

相關問題