Oracle重复删除重建表问题:代码二次执行无法创建表求修正
问题分析与修正代码
原代码的核心问题是:当表存在并成功执行DROP操作后,程序不会进入EXCEPTION块,而CREATE表的逻辑被放在EXCEPTION块内部,因此无法执行。只有当DROP抛出表不存在的异常时,才会通过GOTO触发CREATE流程,导致二次执行时删表后无法重建。
修正后的代码
set serverout on DECLARE table_or_view_does_not_exist exception; pragma exception_init(table_or_view_does_not_exist, -00942); ddl_qry VARCHAR2 (200); ddl_table varchar2(200); r_emp SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST(); v_array SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST( 'ACCT_ID', 'PARENT_ACCT_ID', 'CUST_ID', 'ACCT_NAME', 'BILLING_CYCLE_TYPE', 'PAID_FLAG', 'BILL_DELIVER_METHOD' ); BEGIN -- 嵌套块处理DROP表逻辑,无论成功/失败都继续后续流程 BEGIN ddl_qry := 'Drop Table Accnt_Profile_Spcl'; EXECUTE IMMEDIATE ddl_qry; dbms_output.put_line('表已删除'); EXCEPTION WHEN table_or_view_does_not_exist THEN dbms_output.put_line('目标表不存在,跳过删除操作'); END; -- 重建表(无论之前是否删除成功,都会执行) ddl_table := 'create table Accnt_Profile_Spcl( column_name varchar2(50), spcl_char_count number)'; EXECUTE IMMEDIATE ddl_table; dbms_output.put_line('表已创建'); -- 统计特殊字符并插入数据 FOR i IN 1..v_array.COUNT LOOP r_emp.EXTEND; EXECUTE IMMEDIATE 'SELECT /*+parallel(16)*/ COUNT(*) FROM account_profile WHERE NOT REGEXP_LIKE('||v_array(i)||',''[A-Za-z0-9.]'')' INTO r_emp(i); IF r_emp(i) <> 0 THEN EXECUTE IMMEDIATE 'insert into Accnt_Profile_Spcl values (:param1,:param2)' USING v_array(i), r_emp(i); END IF; END LOOP; END; /
关键修改点
- 将DROP表的逻辑封装在独立的嵌套BEGIN-EXCEPTION块中,确保无论表是否存在,都会执行后续的CREATE表逻辑,避免原代码中流程分支遗漏的问题。
- 移除了原有的GOTO语句,让代码流程更直观,减少维护风险。
- 增加了更清晰的输出提示,方便调试执行状态。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

