oracle utlexcpt.sql使用笔记



[oracle@oel ~]$ export ORACLE_SID=orcl
[oracle@oel ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Fri Feb 16 16:20:51 2018

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
drop user puzzle cascade;
create user puzzle identified by puzzle;
grant create session,resource to puzzle;
create table puzzle.employees as select * from hr.employees;
conn puzzle/puzzle
alter table employees add constraint pk_emp_id primary key(employee_id);

User dropped.

SQL>
User created.

SQL>
Grant succeeded.

SQL>
Table created.

SQL> Connected.
SQL>
Table altered.

SQL> ALTER TABLE EMPLOYEES MODIFY CONSTRAINT PK_EMP_ID DISABLE NOVALIDATE;

Table altered.

insert into PUZZLE.EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
  2  values (205, 'Shelley', 'Higgins', 'SHIGGINS', '515.123.8080', to_date('07-06-2002', 'dd-mm-yyyy'), 'AC_MGR', 12008.00, null, 101, 110);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> ALTER TABLE EMPLOYEES MODIFY CONSTRAINT PK_EMP_ID ENABLE VALIDATE;
ALTER TABLE EMPLOYEES MODIFY CONSTRAINT PK_EMP_ID ENABLE VALIDATE
*
ERROR at line 1:
ORA-02437: cannot validate (PUZZLE.PK_EMP_ID) - primary key violated

--创建异常表
SQL> @?/rdbms/admin/utlexcpt.sql

Table created.
--启用约束讲重复的数据rowid插入到exceptions表中
SQL> ALTER TABLE EMPLOYEES MODIFY CONSTRAINT PK_EMP_ID ENABLE VALIDATE EXCEPTIONS INTO EXCEPTIONS;
ALTER TABLE EMPLOYEES MODIFY CONSTRAINT PK_EMP_ID ENABLE VALIDATE EXCEPTIONS INTO EXCEPTIONS
*
ERROR at line 1:
ORA-02437: cannot validate (PUZZLE.PK_EMP_ID) - primary key violated


SQL> SELECT * FROM EXCEPTIONS;

ROW_ID     OWNER       TABLE_NAME          CONSTRAINT
------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------
AAAV1BAAEAAAAIWAAA PUZZLE       EMPLOYEES          PK_EMP_ID
AAAV1BAAEAAAAITAAH PUZZLE       EMPLOYEES          PK_EMP_ID
--新建一个表,把重复的数据插入到新表
SQL> CREATE TABLE EMPLOYEES_DUP
  2  AS
  3  SELECT * FROM EMPLOYEES
  4  WHERE ROWID IN(SELECT ROW_ID FROM EXCEPTIONS);

Table created.

SQL> SELECT * FROM EMPLOYEES_DUP;

EMPLOYEE_ID FIRST_NAME         LAST_NAME      EMAIL         PHONE_NUMBER        HIRE_DATE    JOB_ID    SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- ---------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------------- ------------------- -------------------- ---------- -------------- ---------- -------------
 205 Shelley         Higgins      SHIGGINS        515.123.8080        2002-06-07 00:00:00 AC_MGR     12008         101     110
 205 Shelley         Higgins      SHIGGINS        515.123.8080        2002-06-07 00:00:00 AC_MGR     12008         101     110
--删除重复的数据
SQL> DELETE FROM EMPLOYEES WHERE ROWID IN(SELECT ROW_ID FROM EXCEPTIONS);

2 rows deleted.

SQL> COMMIT;

Commit complete.
--启用约束
SQL> ALTER TABLE EMPLOYEES MODIFY CONSTRAINT PK_EMP_ID ENABLE VALIDATE;

Table altered.
--EMPLOYEES_DUP中包含重复的数据,自己处理,到底需要那条
SQL>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值