您的位置:首页 > 数据库 > Oracle

工作总结的 -- Oracle merge into 报错& Linux使用

2016-11-02 17:08 393 查看
1. Merge into 问题

程序中merge into: 报ORA-30926: 无法在源表中获得一组稳定的行

原因分析:有一数据数源同一时间传输了两条数据,造成merge into update时不确定从那一条更新从而报错。故障解决: 使用 row_number() over() 语句,根据row_num排序确定最后一条记录,避免重复代码参考MERGE INTO app_outpay.T_CITIC_PAYMENT_TMP t1USING (SELECT a.contract_num,a.cdate,a.edateFROM (SELECT tor.contract_num,tot.cdate,tot.edate,row_number() over(PARTITION BY tor.contract_num ORDER BY tot.id DESC) AS row_idx --ADD AT 20161026 BY richie.ruanFROM app_mo.t_order torJOIN app_mo.t_order_transaction tot ON tor.id = tot.id_orderWHERE /* tor.id_state IN ('8', '11') --comment the condition at 20160920 by richie.ruanAND */tot.id_state = 8AND tot.edate >= trunc(v_txdate) - 1 --Shipment notice received dateAND tot.edate < trunc(v_txdate)) aWHERE a.row_idx = 1) t2ON (t1.text_contract_number = t2.contract_num AND t1.DATE_EFFECTIVE_INSERT >= (trunc(v_txdate) - 21))WHEN MATCHED THENUPDATESET t1.date_activation = trunc(t2.edate) --modified at 20160420 fix the trunc(t2.edate)WHERE t1.text_contract_number = t2.contract_numAND t1.date_activation IS NULL;故障分析延伸:另一部分代码是每天也都有重复值产生,但未引发报错。通过建立测试数据发现,在merge into中对已存在数据,如果该数据需要update的值与“using”代码段内所取结果的一条数据相同,直接选择第二条数据更新,且不会报

 报ORA-30926错误。

测试代码
create table <span style="font-family: Arial, Helvetica, sans-serif;">T_MERGER_VCHAR_TEST_TARGET;</span>
create table <span style="font-family: Arial, Helvetica, sans-serif;">T_MERGER_VCHAR_TEST_SOURCE;</span>
INSERT INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_TARGET
VALUES ('1','TEST');
INSERT INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_TARGET
VALUES ('2','TESTTEST');

INSERT INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_SOURCE
VALUES ('1','TEST');
INSERT INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_SOURCE
VALUES ('2','TESTTEST');
INSERT INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_SOURCE
VALUES ('1','TESTTESTTESTTEST');
INSERT INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_SOURCE
VALUES ('3','TESTTEST');

MERGE INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_TARGET  T1
USING (select * from HCCN_RUAN.T_MERGER_VCHAR_TEST_SOURCE) T2
ON (T1.ID_RA =T2.ID_RA)
WHEN MATCHED THEN
UPDATE
SET T1.INSERT_CHAR=T2.INSERT_CHAR    --因为id=1的值有一条与原值相同,只会更新为另一条记录
<pre name="code" class="sql">INSERT INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_SOURCEVALUES ('1','TESTTEST');INSERT INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_SOURCEVALUES ('2','TESTTEST');INSERT INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_SOURCEVALUES ('1','TESTTESTTESTTEST');INSERT INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_SOURCEVALUES ('3','TESTTEST');MERGE INTO  HCCN_RUAN.T_MERGER_VCHAR_TEST_TARGET  T1USING (select * from HCCN_RUAN.T_MERGER_VCHAR_TEST_SOURCE) T2ON (T1.ID_RA =T2.ID_RA)WHEN MATCHED THENUPDATESET T1.INSERT_CHAR=T2.INSERT_CHAR   <span style="font-family: Arial, Helvetica, sans-serif;">--因为id=1的值有有两条全新的值与原值全不相同, oracle会报</span><span style="font-family: Arial, Helvetica, sans-serif;">30926</span><div></div>
-------------------------------------------Linux 命令总结定时任务 -列出定时任务crontab -l-编辑crontab -e查找命令find-按文件名查找并列出find -name “xxxx.xxxx” -ls   -按类型查找find -type                       f     // 普通文件                      d     //目录文件                      l     //链接文件                      b     //块设备文件                      c     //字符设备文件                      p     //管道文件                      s     //socket文件  -找出并删除find -name “xxxxx” -exec rm {} \;Refer link --http://blog.chinaunix.net/uid-24648486-id-2998767
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux 数据库