在Oracle中创建它之前检查表是否存在
问题描述:
在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
条件,我想这也是写。 请建议我....
答
正如刘若英还评价说,这是相当罕见的第一次检查,然后创建表。 如果你想拥有按你的方法正在运行的代码,这将是:
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;
/
答
请尝试:
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;
答
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;
答
我知道这个话题有点旧,但我想我做了一些对某人有用的东西,所以我发布了它。从这个线程的答案
我编的建议纳入一个过程:
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
)'
);
我知道它有点多余的传递表名称两次,但我认为这是最简单的。
希望有人发现上面有用:-)。
你需要把它放到一个PL/SQL块中。 – Thilo 2013-03-26 06:34:52
在Oracle脚本中,仅尝试创建表并在表已存在的情况下捕获异常是很常见的。 – Rene 2013-03-26 08:19:33