欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

oracle自定义存储过程:删除表(无论表是否存在)和检测表是否存在

程序员文章站 2023-02-06 20:09:59
oracle删除表,如果表不存在,就报错,在跑大型脚本(脚本长且耗时的时候)比较麻烦,一般希望的是点开始然后脚本运行到结束,不可能一直盯着屏幕等弹出提示手工点掉,mysql就很好有drop table if not exist功能CREATE OR REPLACE PROCEDURE p_drop_... ......

oracle删除表,如果表不存在,就报错,在跑大型脚本(脚本长且耗时的时候)比较麻烦,一般希望的是点开始然后脚本运行到结束,不可能一直盯着屏幕等弹出提示手工点掉,mysql就很好有drop table if not exist功能

create or replace procedure p_drop_table_if_exist(p_vc2_tbl_name  in all_tables.table_name%type,
                                    p_vc2_tbl_owner in all_tables.owner%type default user) is
    v_num_tbl_count number(4);
    v_vc2_sql_stmt  varchar2(1000);
  begin
    -- check if table already exists
    p_chk_table_exist(p_vc2_tbl_name, p_vc2_tbl_owner, v_num_tbl_count);
    if (v_num_tbl_count != 0) then
      -- table already exists and must be dropped
      v_vc2_sql_stmt := 'drop table ' || case
                          when p_vc2_tbl_owner is not null then
                           p_vc2_tbl_owner || '.'
                        end || p_vc2_tbl_name || ' purge'
                        ;
      --dbms_output.put_line(v_vc2_sql_stmt);
      execute immediate v_vc2_sql_stmt;
    end if;
  end;




create or replace procedure p_chk_table_exist(p_vc2_tbl_name  in all_tables.table_name%type,
                                p_vc2_tbl_owner in all_tables.owner%type default user,
                                p_num_tbl_count out number -- 1 if table exists, 0 if it doesn't
                                ) is
    v_vc2_tbl_name all_tables.table_name%type := upper(p_vc2_tbl_name);
  begin

    if p_vc2_tbl_owner is not null then
      select count(1)
        into p_num_tbl_count
        from all_tables
       where table_name = v_vc2_tbl_name
         and owner = upper(p_vc2_tbl_owner);
    else
      select count(1)
        into p_num_tbl_count
        from user_tables
       where table_name = v_vc2_tbl_name;
    end if;
  end p_chk_table_exist;

have fun