2013-03-26 157 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 
)' 
); 

我知道它有点多余的传递表名称两次,但我认为这是最简单的。

希望有人发现上面有用:-)。

相关问题