我正在为Oracle数据库写一些迁移脚本,并希望Oracle有类似于MySQL的IF EXISTS构造的东西。
具体来说,每当我想在MySQL中删除一个表时,我就会做这样的事情
DROP TABLE IF EXISTS `table_name`;
这样,如果表不存在,DROP也不会产生错误,脚本可以继续。
Oracle有类似的机制吗?我意识到我可以使用下面的查询来检查表是否存在
SELECT * FROM dba_tables where table_name = 'table_name';
但是把它和DROP绑定在一起的语法让我很困惑。
我更倾向于指定表和模式所有者。
还要注意大小写敏感性。(见下文“上”条款)。
我扔了几个不同的对象,以表明它可以用在桌子之外的地方。
.............
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;
/