实现一个删除表约束为Load数据做准备的处理流程

--1创建临时存储元数据的表
CREATE OR REPLACE PROCEDURE create_temp_table
AS
    v_crtable varchar2(32767):=Q'[CREATE TABLE temp_meta (metadata VARCHAR2(4000))]';
BEGIN
    EXECUTE IMMEDIATE v_crtable; 
END create_temp_table;

--2存储过程实现删除用户表约束为Load数据作准备
CREATE OR REPLACE PROCEDURE drop_user_constraints(p_table_name varchar2)
AS
    v_object_name varchar2(50);
    v_object_type varchar2(50); 
    v_drop_stmt varchar2(32767);
    v_alter_stmt varchar2(32767):=Q'[ALTER TABLE ]';
    TYPE cur IS REF CURSOR;
    meta_cur cur; 
BEGIN
    --通过忽略创建脚本的存储参数来减少元数据长度
    DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
    --获取所创建的约束元数据
    OPEN meta_cur FOR SELECT uc.constraint_type,uc.constraint_name 
                        FROM user_constraints uc
                       WHERE uc.table_name = UPPER(p_table_name)
                         AND uc.constraint_type <> 'C';
    LOOP
    FETCH meta_cur INTO v_object_type,v_object_name;
    EXIT WHEN meta_cur%NOTFOUND;
        v_alter_stmt := v_alter_stmt||p_table_name
                                    ||Q'[ DISABLE CONSTRAINT ]'
                                    ||v_object_name;
        EXECUTE IMMEDIATE v_alter_stmt;
        v_alter_stmt := Q'[ALTER TABLE ]';                           
    END LOOP;
    --获取所创建的索引的元数据 
    OPEN meta_cur FOR SELECT ui.index_type,ui.index_name 
                        FROM user_indexes ui
                       WHERE ui.table_name = UPPER(p_table_name);
    LOOP
    FETCH meta_cur INTO v_object_type,v_object_name;
    EXIT WHEN meta_cur%NOTFOUND;                   
        --将元数据插入到临时表中保存
        INSERT INTO temp_meta 
            SELECT to_char(dbms_metadata.get_ddl('INDEX',v_object_name)) FROM dual;
        --动态SQL删除原表上的索引
        v_drop_stmt := Q'[DROP INDEX ]'||v_object_name;
        EXECUTE IMMEDIATE v_drop_stmt;              
    END LOOP;
END drop_user_constraints;


--3创建存储过程回复原表约束
CREATE OR REPLACE PROCEDURE recovery_user_constrains(p_table_name varchar2)
AS
    v_create_sql varchar2(32767);
    v_object_name varchar2(50);
    v_alter_sql varchar2(32767);
    TYPE cur IS REF CURSOR;
    con_cur cur;
BEGIN
    --重创建的索引
    OPEN con_cur FOR SELECT tm.metadata FROM temp_meta tm;
    LOOP
    FETCH con_cur INTO v_create_sql;
    EXIT WHEN con_cur%NOTFOUND; 
        EXECUTE IMMEDIATE v_create_sql;
    END LOOP;
    --启用所有约束
    OPEN con_cur FOR SELECT uc.constraint_name FROM user_constraints uc
                      WHERE uc.table_name = UPPER(p_table_name)
                        AND uc.status = 'DISABLED';
    LOOP
        FETCH con_cur INTO v_object_name;
        EXIT WHEN con_cur%NOTFOUND;
        v_alter_sql := Q'[ALTER TABLE ]' || p_table_name
                                         || Q'[ ENABLE CONSTRAINT ]'
                                         || v_object_name;
        EXECUTE IMMEDIATE v_alter_sql;               
    END LOOP;                    
END recovery_user_constrains;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值