工作总结的 -- 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中Oracle安装成功后,首次启动使用时,会出现的一些问题总结和解决办法
- Linux下使用oracle的经验总结
- oracle merge into使用
- oracle使用 merge 更新或插入数据(总结)
- Oracle merge into的使用
- ORACLE merge Into 独立使用的用法
- Linux下使用oracle的经验总结
- Linux中oracle学习总结——解决backspace和上下键使用出现乱码
- 在Linux中Oracle安装成功后,首次启动使用时,会出现的一些问题总结和解决办法
- Linux中oracle学习总结——解决backspace和上下键使用出现乱码
- 工作中Linux的使用总结
- oracle使用 merge 更新或插入数据(总结)
- Oracle MERGE INTO的使用方法
- oracle merge into的使用
- [记录]在Linux中Oracle安装成功后,首次启动使用时,会出现的一些问题总结和解决办法
- 使用ociuldr_linux导入导出oracle中的表--工作中打印表的最好解决办法
- Oracle Merge into使用小节(一)
- ORACLE PL/SQL使用经验总结
- Merge Into 语句代替Insert/Update在Oracle中的应用实战
- Linux下apache2+SVN环境下使用问题总结