首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Oracle中创建表之前检查表是否存在

在Oracle中创建表之前检查表是否存在
EN

Stack Overflow用户
提问于 2013-03-26 14:32:24
回答 7查看 132.1K关注 0票数 36

正在尝试检查Oracle中的create之前是否存在表。搜索Stackoverflow和其他网站上的大部分帖子。找到一些查询,但它对我不起作用。

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条件的语法,我想它也是写的。请推荐我……

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-03-26 17:16:15

正如Rene还评论的那样,先检查再创建表是非常不常见的。如果你想根据你的方法运行代码,这将是:

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; 
/
票数 40
EN

Stack Overflow用户

发布于 2016-11-03 23:52:19

我知道这个话题有点老了,但我认为我做了一些可能对某人有用的事情,所以我把它贴了出来。

我将这个帖子的答案中的建议汇编成了一个过程:

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

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

希望有人发现上面的内容很有用:-)。

票数 7
EN

Stack Overflow用户

发布于 2013-03-26 14:56:52

请尝试:

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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15630771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档