drop table如果它存在于Oracle中(IF EXIST)[重复]

46scxncf  于 2023-08-03  发布在  Oracle
关注(0)|答案(4)|浏览(131)

此问题在此处已有答案

Oracle: If Table Exists(16个回答)
6年前关闭。
我使用的是Oracle 12c,我不感兴趣的是,在删除我的表“CONTILENT”时出现错误,以防它不存在。
是我干的

set echo on
set serveroutput on
alter session set current_schema=WORK_ODI;
set verify off
set pause off

begin
  execute immediate 'drop table continent';
  exception when others then null;
end;

字符串
这个剧本和我配合得很好。我也用这个脚本:

declare
   c int;
begin
   select count(*) into c from user_tables where table_name = upper('continent');
   if c = 1 then
      execute immediate 'drop table continent';
   end if;
end;


这两个脚本都工作得很好,但我的老板想要像IF EXIT的东西。任何人都可以帮助我。在这种情况下如何使用IF EXIT?

hxzsmxv2

hxzsmxv21#

你可以做两件事

  • 定义要忽略的异常(此处为ORA-00942)
  • 添加一个未记录的(未实现的)提示/*+ IF EXISTS */,这将使您的管理层满意。

.

declare
  table_does_not_exist exception;
  PRAGMA EXCEPTION_INIT(table_does_not_exist, -942);
begin
  execute immediate 'drop table continent /*+ IF EXISTS */';
  exception when table_does_not_exist then 
        DBMS_OUTPUT.PUT_LINE('Ignoring table or view does not exist')
   ;
end;
/

字符串
补充说明:的用法

exception when others then null;


可能是危险的,例如,当表为NOT DROPPED时,您也忽略了表空间脱机等错误。

piv4azn7

piv4azn72#

对不起,Oracle的drop table语法中没有if exists

1szpjjfi

1szpjjfi3#

set echo on
set serveroutput on
alter session set current_schema=WORK_ODI;
set verify off
set pause off

WHENEVER OSERROR EXIT FAILURE ROLLBACK
drop table continent;
WHENEVER OSERROR CONTINUE

字符串

gc0ot86w

gc0ot86w4#

我也遇到了类似的问题--我需要一种方法来重复DDL脚本而不修改它们。映像以下脚本:

create table tab1(...);

create table tab2(...);

create table tab3{...}; /* <--- this one fails*/

create table tab4(...);

字符串
那么现在我们就出现了这样的情况:表“tab 1”和“tab 2”已成功创建,“tab 3”和“tab 4”缺失。因此,在修复了“tab 3”表的语句之后,我们必须注解掉“tab 1”和“tab 2”的create语句--当处理包含许多DDL和许多bug的大型SQL脚本时,这可能非常烦人。
因此,我提出了以下过程,允许重新运行DDL语句:

create or replace procedure re_run_ddl (p_sql in varchar2)
AUTHID CURRENT_USER
as
  l_line        varchar2(500)   default rpad('-',20,'-');
  l_cr          varchar2(2)     default chr(10);
  l_footer      varchar2(500)   default l_cr||rpad('*',20,'*');
  l_ignore_txt  varchar2(200)   default 'IGNORING --> ';
  ORA_00955 EXCEPTION;
  ORA_01430 EXCEPTION;
  ORA_02260 EXCEPTION;
  ORA_01408 EXCEPTION;
  ORA_00942 EXCEPTION;
  ORA_02275 EXCEPTION;
  ORA_01418 EXCEPTION;
  ORA_02443 EXCEPTION;
  ORA_01442 EXCEPTION;
  ORA_01434 EXCEPTION;
  ORA_01543 EXCEPTION;
  ORA_00904 EXCEPTION;
  ORA_02261 EXCEPTION;
  ORA_04043 EXCEPTION;
  ORA_02289 EXCEPTION;
  PRAGMA EXCEPTION_INIT(ORA_00955, -00955); --ORA-00955: name is already used by an existing object
  PRAGMA EXCEPTION_INIT(ORA_01430, -01430); --ORA-01430: column being added already exists in table
  PRAGMA EXCEPTION_INIT(ORA_02260, -02260); --ORA-02260: table can have only one primary key
  PRAGMA EXCEPTION_INIT(ORA_01408, -01408); --ORA-01408: such column list already indexed
  PRAGMA EXCEPTION_INIT(ORA_00942, -00942); --ORA-00942: table or view does not exist
  PRAGMA EXCEPTION_INIT(ORA_02275, -02275); --ORA-02275: such a referential constraint already exists in the table
  PRAGMA EXCEPTION_INIT(ORA_01418, -01418); --ORA-01418: specified index does not exist
  PRAGMA EXCEPTION_INIT(ORA_02443, -02443); --ORA-02443: Cannot drop constraint  - nonexistent constraint
  PRAGMA EXCEPTION_INIT(ORA_01442, -01442); --ORA-01442: column to be modified to NOT NULL is already NOT NULL
  PRAGMA EXCEPTION_INIT(ORA_01434, -01434); --ORA-01434: private synonym to be dropped does not exist
  PRAGMA EXCEPTION_INIT(ORA_01543, -01543); --ORA-01543: tablespace '<TBS_NAME>' already exists
  PRAGMA EXCEPTION_INIT(ORA_00904, -00904); --ORA-00904: "%s: invalid identifier"
  PRAGMA EXCEPTION_INIT(ORA_02261, -02261); --ORA-02261: "such unique or primary key already exists in the table"
  PRAGMA EXCEPTION_INIT(ORA_04043, -04043); --ORA-04043: object %s does not exist
  PRAGMA EXCEPTION_INIT(ORA_02289, -02289); --ORA-02289: sequence does not exist
  procedure p(
         p_str      in  varchar2
        ,p_maxlength    in  int     default 120
  )
  is
     i      int := 1;
  begin
    dbms_output.enable( NULL );

    while ( (length(substr(p_str,i,p_maxlength))) = p_maxlength ) loop
        dbms_output.put_line(substr(p_str,i,p_maxlength));
        i := i + p_maxlength;
    end loop;

    dbms_output.put_line(substr(p_str,i,p_maxlength));
  end p;
begin

  p( 'EXEC:'||l_cr||l_line||l_cr||p_sql||l_cr||l_line );

  execute immediate p_sql;

  p( 'done.' );

exception
  when  ORA_00955 or ORA_01430 or ORA_02260 or ORA_01408 or ORA_00942
        or ORA_02275 or ORA_01418 or ORA_02443 or ORA_01442 or ORA_01434
        or ORA_01543 or ORA_00904 or ORA_02261 or ORA_04043 or ORA_02289
    then p( l_ignore_txt || SQLERRM || l_footer );
  when OTHERS then
    p( SQLERRM );
    p( DBMS_UTILITY.FORMAT_ERROR_BACKTRACE );
    p( l_footer );
    RAISE;
end;
/
show err


使用示例:

set serveroutput on
begin
re_run_ddl('
create table test
(
  id    number,
  s     varchar2(30) 
)
');
end;
/
exec re_run_ddl('drop table test');
exec re_run_ddl('drop table test');
exec re_run_ddl('drop table test');


输出量:

EXEC:
--------------------

create table test
(
  id    number,
  s     varchar2(30)
)

--------------------
done.

PL/SQL procedure successfully completed.

EXEC:
--------------------
drop table test
--------------------
done.

PL/SQL procedure successfully completed.

stx11de2> EXEC:
--------------------
drop table test
--------------------
IGNORING --> ORA-00942: table or view does not exist
********************

PL/SQL procedure successfully completed.

stx11de2> EXEC:
--------------------
drop table test
--------------------
IGNORING --> ORA-00942: table or view does not exist
********************

PL/SQL procedure successfully completed.

相关问题