如果 table 存在于 oracle 中,如何删除 table?
How can drop table if table exists in oracle?
我正在尝试使用我生成的模式文件通过我的 java 应用程序创建数据库。在模式中,我也包含了删除查询。但是我想对 DROP QUERY 做一些改进。所以我想在 运行 删除查询之前检查数据库对象是否存在,并且仅在存在时才删除。
我用谷歌搜索并找到了一些 oracle link,一些 link 建议遵循语法,一些提到 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
我参考了以下 links:-
https://community.oracle.com/thread/2421779?tstart=0
如果有任何其他查询要删除 table 如果 table 存在,请建议我。
删除 table,不检查。如果存在任何错误,您将永远不知道什么时候出了问题。
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;
如果您 运行 遵循代码,则不必检查 table 是否存在以及在出现错误时(table 已被 now wait 或您知道的任何其他内容锁定它)
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;
试试这个:它会掉落 table 'table_name' 如果它存在。
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;
我正在尝试使用我生成的模式文件通过我的 java 应用程序创建数据库。在模式中,我也包含了删除查询。但是我想对 DROP QUERY 做一些改进。所以我想在 运行 删除查询之前检查数据库对象是否存在,并且仅在存在时才删除。 我用谷歌搜索并找到了一些 oracle link,一些 link 建议遵循语法,一些提到 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
我参考了以下 links:- https://community.oracle.com/thread/2421779?tstart=0
如果有任何其他查询要删除 table 如果 table 存在,请建议我。
删除 table,不检查。如果存在任何错误,您将永远不知道什么时候出了问题。
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;
如果您 运行 遵循代码,则不必检查 table 是否存在以及在出现错误时(table 已被 now wait 或您知道的任何其他内容锁定它)
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;
试试这个:它会掉落 table 'table_name' 如果它存在。
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;