我正在为Oracle数据库编写一些迁移脚本,并且希望Oracle有类似MySQL的IF EXISTS
结构。
具体来说,每当我想在MySQL中删除表时,我都会这样做
DROP TABLE IF EXISTS `table_name`;
这样,如果表不存在, DROP
不会产生错误,脚本可以继续。
Oracle是否有类似的机制? 我意识到我可以使用以下查询来检查表是否存在
SELECT * FROM dba_tables where table_name = 'table_name';
但是将DROP
与DROP
绑在一起的语法正在逃避我。
#1楼
只是想发布一个完整的代码来创建一个表,如果已经存在使用Jeffrey的代码就放弃它(对他而言,不是我!)。
BEGIN
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE tablename';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
EXECUTE IMMEDIATE 'CREATE TABLE tablename AS SELECT * FROM sourcetable WHERE 1=0';
END;
#2楼
我更喜欢指定表和架构所有者。
注意区分大小写。 (参见下面的“上部”条款)。
我扔了几个不同的对象,以表明可以在TABLEs之外的地方使用。
.............
declare
v_counter int;
begin
select count(*) into v_counter from dba_users where upper(username)=upper('UserSchema01');
if v_counter > 0 then
execute immediate 'DROP USER UserSchema01 CASCADE';
end if;
end;
/
CREATE USER UserSchema01 IDENTIFIED BY pa$$word
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON users;
grant create session to UserSchema01;
和一个TABLE示例:
declare
v_counter int;
begin
select count(*) into v_counter from all_tables where upper(TABLE_NAME)=upper('ORDERS') and upper(OWNER)=upper('UserSchema01');
if v_counter > 0 then
execute immediate 'DROP TABLE UserSchema01.ORDERS';
end if;
end;
/
#3楼
可悲的是,如果存在则没有丢弃,或者如果不存在则不会创建
您可以编写一个plsql脚本来包含逻辑。
http://download.oracle.com/docs/cd/B12037_01/server.101/b10759/statements_9003.htm
我对Oracle语法不太了解,但我认为@ Erich的脚本会是这样的。
declare
cant integer
begin
select into cant count(*) from dba_tables where table_name='Table_name';
if count>0 then
BEGIN
DROP TABLE tableName;
END IF;
END;
#4楼
在oracle中没有'DROP TABLE IF EXISTS',你必须做select语句。
试试这个(我没有使用oracle语法,所以如果我的变量是ify,请原谅我):
declare @count int
select @count=count(*) from all_tables where table_name='Table_name';
if @count>0
BEGIN
DROP TABLE tableName;
END
#5楼
declare
c int;
begin
select count(*) into c from user_tables where table_name = upper('table_name');
if c = 1 then
execute immediate 'drop table table_name';
end if;
end;
这是用于检查当前模式中的表是否存在。 要检查给定表是否已存在于不同的模式中,您必须使用all_tables
而不是user_tables
并添加条件all_tables.owner = upper('schema_name')