动态删除,创建索引

在大批量数据insert的时候,往往要先删除索引,在数据insert好了以后在重新创建索引,所以写了一下过程,用于自动调用[@more@]

create table TEMP_INDEX
(
INDEX_SRC CLOB,
FLAG NUMBER(1)
);

CREATE OR REPLACE PROCEDURE P_ALTER_INDEX(AN_O_RET_CODE OUT NUMBER,
AC_O_RET_MSG OUT VARCHAR2,
AC_I_TABLE_NAME IN VARCHAR2,
AC_I_FLAG IN NUMBER,
AC_I_USER IN VARCHAR2) IS
/******************************************************************
输入参数:
AC_I_TABLE_NAME 需要删除索引的表,默认全部
AC_I_FLAG 为 0 时删除,为 1 时创建
输出参数:
AN_O_RET_CODE 返回的代码
AC_O_RET_MSG 返回信息
调用举例:
VARIABLE AN_O_RET_CODE NUMBER;
VARIABLE AC_O_RET_MSG VARCHAR2;
EXEC P_ALTER_INDEX(:AN_O_RET_CODE,:AC_O_RET_MSG,'p_cl_sa_allotment');
功能修订:
简要说明:
用于WEB端调用
修订记录:
修订日期 修订人 修改内容简要说明
---------- --------- ------------------------------
2007-04-18 LY Created
******************************************************************/

AC_SQL VARCHAR2(1000);
BEGIN
AN_O_RET_CODE := 0;
AC_O_RET_MSG := '编辑成功';

IF AC_I_FLAG = 0 THEN
DELETE FROM TEMP_INDEX WHERE FLAG = 1;
COMMIT;
IF AC_I_TABLE_NAME IS NOT NULL THEN
--备份索引
INSERT /*+append*/
INTO TEMP_INDEX
(INDEX_SRC, FLAG)
SELECT DBMS_METADATA.GET_DDL('INDEX', U.INDEX_NAME), 0
FROM ALL_INDEXES U
WHERE TABLE_NAME = AC_I_TABLE_NAME
AND OWNER = AC_I_USER;
COMMIT;
--删除索引
FOR SUR IN (SELECT INDEX_NAME
FROM USER_INDEXES
WHERE TABLE_NAME = AC_I_TABLE_NAME) LOOP
BEGIN
EXECUTE IMMEDIATE 'DROP INDEX ' || SUR.INDEX_NAME;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END LOOP;
ELSE
--备份索引
INSERT /*+append*/
INTO TEMP_INDEX
(INDEX_SRC, FLAG)
SELECT DBMS_METADATA.GET_DDL('INDEX', U.INDEX_NAME), 0
FROM ALL_INDEXES U
WHERE OWNER = AC_I_USER;
--删除索引
FOR SUR IN (SELECT INDEX_NAME FROM USER_INDEXES) LOOP
BEGIN
EXECUTE IMMEDIATE 'DROP INDEX ' || SUR.INDEX_NAME;

EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END LOOP;
END IF;

--创建索引
ELSIF AC_I_FLAG = 1 THEN
FOR CUR IN (SELECT A.ROWID, A.INDEX_SRC FROM TEMP_INDEX A WHERE FLAG = 0) LOOP
BEGIN
SELECT INDEX_SRC INTO AC_SQL FROM TEMP_INDEX WHERE ROWID = CUR.ROWID;
EXECUTE IMMEDIATE AC_SQL;
UPDATE TEMP_INDEX SET FLAG = 1 WHERE ROWID = CUR.ROWID;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END LOOP;
END IF;
EXCEPTION
WHEN OTHERS THEN
AN_O_RET_CODE := -1;
AC_O_RET_MSG := '错误代码:' || SQLCODE || CHR(13) || '错误信息:' || SQLERRM;
END P_ALTER_INDEX;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/60217/viewspace-912614/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/60217/viewspace-912614/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值