`
jinghuainfo
  • 浏览: 1526079 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ORA-00001: 违反唯一约束条件收藏 function change_alt1(btn,style){var btn=document.getElementById(btn);btn.style.display = style;}此文于2010-05-14被推荐到CSDN首页如何被推荐?

 
阅读更多
<p>如何查出违反唯一关键子的类似SQLERRM<br><br>
有个过程 每天更新用户信息表<br>
原本采用MERGE 来做的,可是有人嫌它慢,建议采用DELETE INSERT来做<br>
我先 delete userinfo wehre logtime &gt; trunc(sysdate)-15 ; commit;<br>
insert into userinfo <br>
select * fromt_cache_userinfo a,t_cache_usertype b,t_cache_expuserinfo c<br>
where a.ui_usertype=b.ut_id <br>
and a.ui_username=c.ui_username<br>
and c.ui_lasttime &gt; trunc(sysdate)-15;<br><br>
ORA-00001: 违反唯一约束条件<br><br>
oracle 可有 sql%count sqlcode sqlerrm 获得被违反了关键字哪行数据 最好是ROWID</p>


<p>The failure causes the whole insert to roll back, regardless of how
many rows were inserted successfully. Adding the DML error logging
clause allows us to
complete the insert of the valid rows.</p>
<blockquote>
<pre>INSERT INTO dest<br>

SELECT *<br>

FROM   source<br>

LOG ERRORS INTO err$_dest ('INSERT') REJECT LIMIT UNLIMITED;<br><br>

99998 rows created.<br><br>

SQL&gt;</pre>
</blockquote>
<p>
The rows that failed during the insert are stored in the <code>ERR$_DEST</code>
table, along with the reason for the failure.</p>
<pre>COLUMN ora_err_mesg$ FORMAT A70<br>

SELECT ora_err_number$, ora_err_mesg$<br>

FROM   err$_dest<br>

WHERE  ora_err_tag$ = 'INSERT';<br><br>

ORA_ERR_NUMBER$ ORA_ERR_MESG$<br>

--------------- ---------------------------------------------------------<br>

           1400 ORA-01400: cannot insert NULL into ("TEST"."DEST"."CODE")<br>

           1400 ORA-01400: cannot insert NULL into ("TEST"."DEST"."CODE")<br><br><br><br><br><span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">oracle10g</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">新功能,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">log error</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">的实验<br><br></span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">当你通过</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">DML</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">语句对一个表进行</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">DML</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">操作时</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">如果一个违反某种约束的错误记录发生</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">则整个事务会中止并回滚</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,<br></span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">这样会严重影响数据的刷新和浪费系统的性能</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">为了解决这种问题</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,oracle10g</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">提供了一个错误记录日志表的功能</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,<br></span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">拿</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">insert</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">操作举例</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">得用该功能可以将一个源记录集合中满足约束条件的记录插入目的表中</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">而将违反约束的记录</span>
</span>
</span>
<span lang="en-us"><span style=""><br></span>
</span>
<span lang="en-us"><span style=""><span style="">插入错误日志表</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">这样既充分利用了系统的资源</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">又可以延迟处理错误记录</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">.</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">对于数据仓库是一个非常有用的方法</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">.<br><br></span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">具体使用该方法一般包括三个步骤</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">:<br>
1</span>
</span>
</span>
<span lang="en-us"><span style=""> <span style="">创建错误日志表</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">共有二种方法</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;"></span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">法一</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">:</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">利</span>
<span style="">用</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">DBMS_ERRLOG.create_error_log</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">函数</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">;<br>
EXEC DBMS_ERRLOG.create_error_log(dml_table_name =&gt; 'A')<br></span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">创建出来错误日志表名为</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">err$_a,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">即创建的</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">error</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">表以</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">err$_</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">开头,加上表名</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">我们也可指定错误日志表名</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;"></span>
<span style="font-family: Verdana; color: #000000; font-size: x-small;">DBMS_ERRLOG.create_error_log(dml_table_name =&gt; 'A',err_log_table_name =&gt; 'A_LOG');<br></span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">法二</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">:</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">手工创建错误日志表</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;"></span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">但需要注意</span>
<span style="">的是手工创建的错误日志表结构需要满足</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">oracle</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">规定</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">否则会报错</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">.<br>
2</span>
</span>
</span>
<span lang="en-us"><span style=""> <span style="">执行带</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;"> error logging</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">参数的</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">DML</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">语句</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">其</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">insert</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">语法结构如下</span>
<span style="">其实我也没有找到</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">update</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">或者</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">delete</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">相关语法</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">^_^)<br>
  insert_into_clause<br>
  { values_clause [ returning_claus</span>
<span style="font-family: Verdana; color: #000000; font-size: x-small;">e ]<br>
  | subquery<br>
  }<br>
  [ error_logging_clause ]<br>
3</span>
</span>
</span>
<span lang="en-us"><span style=""> <span style="">查询错误日志表</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">和一般的</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">select</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">语句一样</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">.<br><br></span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">下边我拿</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">insert</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">操作做测试用例</span>
</span>
</span>
<span lang="en-us"><span style=""><br><br><span style="font-family: Verdana; color: #000000; font-size: x-small;">--</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">创建测试表</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;">CREATE TABLE a<br>
AS<br>
SELECT  ROWNUM id,rownum+1 VALUE<br>
FROM all_objects<br>
WHERE  rownum&lt;3;<br><br>
--</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">创建唯一性索引</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;">CREATE UNIQUE INDEX unq_a ON</span>
<span style="font-family: Verdana; color: #000000; font-size: x-small;"> a(id);<br><br>
--</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">利用系统包来创建相应</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">error log</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">表</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;">EXEC DBMS_ERRLOG.create_error_log(dml_table_name =&gt; 'A',err_log_table_name =&gt; 'A_LOG');<br>
PL/SQL procedure successfully completed.<br><br>
SQL&gt; desc A_LOG<br>
Name      Null?  Type<br>
--------------------- -------- -----------</span>
<span style="font-family: Verdana; color: #000000; font-size: x-small;">------<br>
ORA_ERR_NUMBER$      NUMBER   --</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">错误记录数</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;">ORA_ERR_MESG$      VARCHAR2(2000) --</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">错误信息</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;">ORA_ERR_ROWID$     ROWID    --</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">错误记录的</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">rowid(</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">仅对</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">update</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">或</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">delete)<br>
ORA_ERR_OPTYP$     VARCHAR2(2)  --</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">操作类型</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">(I-INSERT,U-UP</span>
<span style="font-family: Verdana; color: #000000; font-size: x-small;">DATE,D-DELETE)<br>
ORA_ERR_TAG$       VARCHAR2(2000) --</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">自定义标志说明</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;">ID         VARCHAR2(4000) --</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">原表字段</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;">VALUE        VARCHAR2(4000) --</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">原表字段</span>
</span>
</span>
<span lang="en-us"><span style=""><br></span>
</span>
<span lang="en-us"><span style=""><span style="">其中前五个字段是固定的</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">后边字段根据原表确定</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">.<br><br><br></span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">请注意</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">:</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">原表和对应</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">error log</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">表的字段类型是不完全匹配的</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">其转换规则如下</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">:<br>
NUMBER  </span>
<span style="font-family: Verdana; color: #000000; font-size: x-small;">      VARCHAR2(4000)<br>
CHAR/VARCHAR2(n)  VARCHAR2(4000)<br>
NCHAR/NVARCHAR2(n)  NVARCHAR2(4000)<br>
DATE/TIMESTAMP      VARCHAR2(4000)<br>
RAW        RAW(2000)<br>
ROWID        UROWID<br>
LONG/LOB     </span>
</span>
</span>
<span lang="en-us"><span style=""> <span style="">不支持</span>
</span>
</span>
<span lang="en-us"><span style=""><br></span>
</span>
<span lang="en-us"><span style=""><span style="">自定义类型</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;"></span>
<span style="font-family: Verdana; color: #000000; font-size: x-small;">     </span>
</span>
</span>
<span lang="en-us"><span style=""> <span style="">不支持</span>
</span>
</span>
<span lang="en-us"><span style=""><br><br><span style="font-family: Verdana; color: #000000; font-size: x-small;">--</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">插入数据</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,rownum&lt;3</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">的记录违反约束</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">,ROWNUM=3</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">的记录正常插入</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;">SQL&gt; INSERT INTO a<br>
2SELECT ROWNUM id, rownum+1 VALUE<br>
3FROM   all_objects<br>
4WHERE  rownum&lt;4<br>
5LOG ERRORS INTO A_LOG REJECT LIMIT UNLIMITED<br>
6;<br>
1 ROWS creat</span>
<span style="font-family: Verdana; color: #000000; font-size: x-small;">ed.<br><br>
--</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">请注意:此处为</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">UNLIMITED</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">,即不限制错误记录的条数,默认为</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">0</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">,即有错误记录就停止整个事务并回滚,我们也可人为设置一个数目,</span>
</span>
</span>
<span lang="en-us"><span style=""><br><span style="font-family: Verdana; color: #000000; font-size: x-small;">--</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">假设为</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">20</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">,即插入时错误记录数超过</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">20</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="">则停止整个事务并回滚</span>
</span>
</span>
<span lang="en-us"><span style=""><span style="font-family: Verdana; color: #000000; font-size: x-small;">~</span>
</span>
</span>
<br></pre>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics