正在尝试检查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
条件的语法,我想它也是写的。请推荐我……
发布于 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;
/
发布于 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
)'
);
我知道传递两次表名有点多余,但我认为这在这里是最简单的。
希望有人发现上面的内容很有用:-)。
发布于 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;
https://stackoverflow.com/questions/15630771
复制相似问题