Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103781926
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-21 21:15:27

来自:

当前用户下外键的处理 ENABLE或者 DISABLE

v_CursorID := DBMS_SQL.OPEN_CURSOR;
  LOOP
  FETCH C_CON into R_CON;
  notfound:=C_CON%NOTFOUND;
  EXIT WHEN notfound;
  begin
  IF (UPPER(AS_ALTER)='DISABLE' AND R_CON.STATUS='ENABLED' OR
  UPPER(AS_ALTER)='ENABLE' AND R_CON.STATUS='DISABLED') THEN
  v_StrCon := 'ALTER TABLE '||R_CON.owner||'.'||R_CON.table_name||' '||
  UPPER(as_alter) || ' CONSTRAINT '||R_CON.constraint_name;
  DBMS_SQL.PARSE( v_CursorID, v_StrCon, DBMS_SQL.V7);
  v_FkNum :=v_FkNum+1;
  END IF;
  EXCEPTION
  WHEN OTHERS THEN
  v_sqlcode := SQLCODE;
  v_sqlerrm := SUBSTR(SQLERRM,1,600);
  DBMS_OUTPUT.PUT_LINE('ERROR: '||' '||V_SQLERRM);
  -- 找出错误原因
  IF (v_sqlcode = -2298) THEN
  p_con_err(R_CON.CONSTRAINT_NAME);
  END IF;
  END;
  END LOOP;
  CLOSE C_CON;
  DBMS_OUTPUT.PUT_LINE('====== Foreign Keys were '||as_alter||', total '||to_char(v_FkNum)||'   =====');
  -- 当前用户下触发器的处理 ENABLE或者 DISABLE
  FOR T_TRIGGER IN C_TRIGGER LOOP
  BEGIN
  IF (UPPER(AS_ALTER)='DISABLE' AND T_TRIGGER.STATUS='ENABLED' OR
  UPPER(AS_ALTER)='ENABLE' AND T_TRIGGER.STATUS='DISABLED') THEN
  v_StrTri := 'ALTER TRIGGER '||T_TRIGGER.TRIGGER_name ||' '||UPPER(as_alter);
  DBMS_SQL.PARSE( v_CursorID, v_StrTri, DBMS_SQL.V7);
  v_TriNum :=v_TriNum+1;
  END IF;
  EXCEPTION
  WHEN OTHERS THEN
  v_sqlcode := SQLCODE;
  v_sqlerrm := SUBSTR(SQLERRM,1,600);
  DBMS_OUTPUT.PUT_LINE('ERROR: '||V_SQLCODE||' '||V_SQLERRM);
  END;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('====== Triggers were '||as_alter||', total '||to_char(v_TriNum)||'   =====');
  DBMS_SQL.CLOSE_CURSOR(v_CursorID);
  ELSE -- 输入参数不正确
  DBMS_OUTPUT.PUT_LINE('ERROR:输入参数不正确,参数为ENABLE或者DISABLE!');
  END IF;
  DBMS_OUTPUT.PUT_LINE('END TIME: '||to_char(sysdate));
  END;
  /

二、约束错误自动查找脚本

一般,数据库管理员在对数据进行维护时,如新数据的导入前,首先要关闭所有的外键和触发器,数据成功导入后,再打开导入前关闭的外键和触发器。这时经常会遇到错误号为ORA-02298的“未找到父项关键字”的错误。该错误的原因就是数据库表中出现了不能满足外键约束条件的记录。这里,另外给出了一个脚本(P_CON_ERR)用来自动查找造成这类错误的原因,也就是找出不满足外键约束条件的字段值。

该存储过程可单独运行,同时在前面介绍的存储过程P_ALTERCONS中也进行了调用,在存储过程P_ALTERCONS中,可以看到在打开外键时,如果出现错误号为ORA-02298的错误,就调用该存储过程,自动查找造成外键不能启动的原因。

下面是单独运行该存储过程的例子,在SQL/PLUS环境下:

SQL> SET SERVEROUTPUT ON;
  SQL> EXEC P_CON_ERR('FK_SB_HJJL_RELATION__SB_PZXH');
  外键错误情况
  ============
  NSRNM,PZLXDM,PZXH
  -----------------
  190321058, 900, 13546
  777777775, 108, 17526
  777777775, 108, 17528
  777777775, 108, 17531
  777777775, 108, 17546

阅读(191) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~