oracle merge into 报 ora-02064错误
来源:互联网 发布:复合变换矩阵 编辑:程序博客网 时间:2024/04/28 21:27
今天在用Oracle的merge into同步数据的时候,遇到了ora-02064:distributed operation not supported,这个错误的描述是说merge into不支持分布式事务操作。
CREATE OR REPLACE PROCEDURE PROC_BLACKLIST_DATA_SYNC(v_date VARCHAR2) AS /****************************************************************************** NAME: PROC_BLACKLIST_DATA_SYNC PURPOSE: 黑名单数据同步 PARAMETERS: Name Description --------- ------------------------------------------------------------------ v_date 需要同步的数据日期 REVISIONS: Ver Date Author Description --------- ---------- --------------- ------------------------------------ 1.0 2016-04-08 jay 1. Created this procedure. ******************************************************************************/ v_errmsg varchar2(255); CURSOR C_TEMPBLACKLIST IS --黑名单表 SELECT DISTINCT IRFCNUM FROM SAPDT_WAKBL WHERE ISDO IS NULL AND LOGDATE BETWEEN TO_DATE(V_DATE || '00:00:00', 'yyyy-mm-ddhh24:mi:ss') AND TO_DATE(V_DATE || '23:59:59', 'yyyy-mm-ddhh24:mi:ss') ORDER BY IRFCNUM; C_TEMPBLACKLIST_REC C_TEMPBLACKLIST%ROWTYPE;--PRAGMA AUTONOMOUS_TRANSACTION;BEGINFOR C_TEMPBLACKLIST_REC IN C_TEMPBLACKLIST LOOP MERGE INTO SAP_WAKBLL@POSDB A USING (SELECT * FROM SAPDT_WAKBL WHERE (ISDO = 0 or isdo is null) AND IRFCNUM = C_TEMPBLACKLIST_REC.IRFCNUM AND LOGDATE BETWEEN to_date(v_date || '00:00:00', 'yyyy-mm-ddhh24:mi:ss') AND to_date(v_date || '23:59:59', 'yyyy-mm-ddhh24:mi:ss') ) B on (A.AKTNR = B.AKTNR AND A.AKTYP = B.AKTYP AND A.OBTYP = B.OBTYP AND A.VALUE = B.VALUE) --SAP_WAKBLL@POSDB只有4个字段,如果都已经匹配则没有其它字段可以更新
WHEN NOT MATCHED THEN INSERT VALUES ( B.AKTNR, B.AKTYP, B.OBTYP, B.VALUE, B.IRFCNUM); UPDATE SAPDT_WAKBL T SET T.ISDO = 1 WHERE (ISDO = 0 or isdo is null) AND IRFCNUM = C_TEMPBLACKLIST_REC.IRFCNUM AND LOGDATE BETWEEN to_date(v_date || '00:00:00', 'yyyy-mm-ddhh24:mi:ss') AND to_date(v_date || '23:59:59', 'yyyy-mm-ddhh24:mi:ss'); COMMIT;END LOOP;EXCEPTION WHEN OTHERS THEN V_ERRMSG := TRIM(SQLERRM); ROLLBACK; RAISE;END;<div> </div>
百度了下网上说是10g的一个bug,
http://space.itpub.net/637736/viewspace-312612
再查询了oracle的官方文档却说支持这种操作:
You can specify this clause(这里是说match_insert_clause) by itself or with the merge_update_clause. If you
specify both, then they can be in either order.
解决的办法是:加上标红的语句加一个无实际意义的merge_update_clause,严格按照oracle的标准语法走
CREATE OR REPLACE PROCEDURE PROC_BLACKLIST_DATA_SYNC(v_date VARCHAR2) AS /****************************************************************************** NAME: PROC_BLACKLIST_DATA_SYNC PURPOSE: 黑名单数据同步 PARAMETERS: Name Description --------- ------------------------------------------------------------------ v_date 需要同步的数据日期 REVISIONS: Ver Date Author Description --------- ---------- --------------- ------------------------------------ 1.0 2016-04-08 jay 1. Created this procedure. ******************************************************************************/ v_errmsg varchar2(255); CURSOR C_TEMPBLACKLIST IS --黑名单表 SELECT DISTINCT IRFCNUM FROM SAPDT_WAKBL WHERE ISDO IS NULL AND LOGDATE BETWEEN TO_DATE(V_DATE || '00:00:00', 'yyyy-mm-ddhh24:mi:ss') AND TO_DATE(V_DATE || '23:59:59', 'yyyy-mm-ddhh24:mi:ss') ORDER BY IRFCNUM; C_TEMPBLACKLIST_REC C_TEMPBLACKLIST%ROWTYPE;--PRAGMA AUTONOMOUS_TRANSACTION;BEGINFOR C_TEMPBLACKLIST_REC IN C_TEMPBLACKLIST LOOP MERGE INTO SAP_WAKBLL@POSDB A USING (SELECT * FROM SAPDT_WAKBL WHERE (ISDO = 0 or isdo is null) AND IRFCNUM = C_TEMPBLACKLIST_REC.IRFCNUM AND LOGDATE BETWEEN to_date(v_date || '00:00:00', 'yyyy-mm-ddhh24:mi:ss') AND to_date(v_date || '23:59:59', 'yyyy-mm-ddhh24:mi:ss') ) B on (A.AKTNR = B.AKTNR AND A.AKTYP = B.AKTYP AND A.OBTYP = B.OBTYP AND A.VALUE = B.VALUE) --SAP_WAKBLL@POSDB只有4个字段,如果都已经匹配则没有其它字段可以更新 <span style="color:#ff0000;"> </span><span style="color:#ff0000;"><strong>WHEN MATCHED THEN UPDATE SET A.IRFCNUM = B.IRFCNUM</strong></span> WHEN NOT MATCHED THEN INSERT VALUES ( B.AKTNR, B.AKTYP, B.OBTYP, B.VALUE, B.IRFCNUM); UPDATE SAPDT_WAKBL T SET T.ISDO = 1 WHERE (ISDO = 0 or isdo is null) AND IRFCNUM = C_TEMPBLACKLIST_REC.IRFCNUM AND LOGDATE BETWEEN to_date(v_date || '00:00:00', 'yyyy-mm-ddhh24:mi:ss') AND to_date(v_date || '23:59:59', 'yyyy-mm-ddhh24:mi:ss'); COMMIT;END LOOP;EXCEPTION WHEN OTHERS THEN V_ERRMSG := TRIM(SQLERRM); ROLLBACK; RAISE;END;
0 0
- oracle merge into 报 ora-02064错误
- ORACLE ORA-00600: 内部错误代码, 参数: [kokbcvb1]与merge into
- 工作总结的 -- Oracle merge into 报错& Linux使用
- Oracle select --merge into:
- oracle merge into 测试
- oracle merge into
- oracle merge into 实例
- Oracle 之 MERGE INTO
- Oracle:merge into
- Oracle数据库merge into
- oracle merge into
- oracle merge into
- oracle merge into用法
- merge into(oracle)
- ORACLE MERGE INTO
- oracle merge into 用法
- oracle merge into
- Oracle merge into 命令
- 算法之动态规划
- SQL-联结表
- HashMapUtil java项目中缓存的使用
- LA 4329 Ping pong
- RN(react native)入坑指南-08,如何加载远程数据
- oracle merge into 报 ora-02064错误
- elk之kibana安装与配置
- 光流
- Android NDK errors
- 痛彻心扉
- 给台式机设置双屏
- v8 Convert JSObject To String
- leetCode——随机链表复制
- 第八周项目1(2)