我正在尝试使用我生成的模式文件通过我的java应用程序创建数据库。在模式中,我还包括了drop查询。但我想对DROP QUERY做一些改进。所以我想在运行drop查询之前检查db对象是否存在,并且只在它存在时才删除。 我用Google搜索并发现了一些oracle链接,有些链接建议遵循语法,有些提到ORACLE does not support such syntax。
SYNTAX A:
IF EXISTS DROP TABLE TABLE_NAME
SYNTAX B:
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT | CASCADE]
我也尝试过以下查询: -
IF EXISTS (SELECT * FROM dba_objects WHERE OBJECT_NAME = 'BBB' )
DROP TABLE [BBB]
但它给出了错误: -
Error starting at line 2 in command:
DROP TABLE [BBB]
Go
Error report:
SQL Error: ORA-00903: invalid table name
00903. 00000 - "invalid table name"
*Cause:
*Action:
Error starting at line 1 in command:
IF EXISTS (SELECT * FROM dba_objects WHERE OBJECT_NAME = 'BBB' ) DROP TABLE [BBB]
Error report:
Unknown Command
我提到以下链接: - https://community.oracle.com/thread/2421779?tstart=0
如果表存在,请建议我是否有任何其他查询要删除有条件的表。
答案 0 :(得分:4)
删除表而不检查。如果存在任何错误,您将永远不知道什么时候出错了。
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE my_table';
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
或者您可以在Oracle词典中搜索。
DECLARE
l_cnt NUMBER;
BEGIN
SELECT count(*)
INTO l_cnt
FROM user_tables
WHERE table_name = 'MY_TABLE';
IF l_cnt = 1 THEN
EXECUTE IMMEDIATE 'DROP TABLE my_table';
END IF;
END;
答案 1 :(得分:1)
如果您运行以下代码,则不必检查表是否存在以及是否存在错误(表已锁定,现在等待或您将了解其他任何其他代码)
begin
for c1 in (select owner,table_name from dba_tables where table_name='MY_TABLE') loop
execute immediate 'drop table '||c1.owner||'.'||c1.table_name||'';
end loop;
end;
答案 2 :(得分:0)
declare
a varchar2(700) ;
begin
execute immediate ' SELECT CASE WHEN tab = 1
THEN ''DROP TABLE TABLE_NAME''
ELSE ''select 1 from dual''
END
FROM ( SELECT sum(case when table_name = ''TABLE_NAME'' then 1 else 0 end ) as tab FROM user_tables)' into a;
EXECUTE IMMEDIATE a;
end;