oracle 两个一样的表数据该同步

有两张表:tb_123sz tb_789gz
字段如下:
ORDER_NO VARCHAR2(12) not null, KIJUN_YM VARCHAR2(6) not null, RECP_KBN VARCHAR2(2) not null, SEQ NUMBER(2) not null, SALE_ORGCD VARCHAR2(6), SALE_TEAMCD VARCHAR2(6), SALE_EMPNO VARCHAR2(6), INCOME_ORGCD VARCHAR2(6), INCOME_TEAMCD VARCHAR2(6), INCOME_EMPNO VARCHAR2(6), SALE_KBN VARCHAR2(2), GOODS_CD VARCHAR2(11), CONT_MONTH VARCHAR2(2), OPTION_KBN VARCHAR2(2), PAY_CNT VARCHAR2(2), RECP_METHOD VARCHAR2(2), RECP_TYPE VARCHAR2(2), TARGET_AMT NUMBER(11,2), RECP_AMT NUMBER(11,2), DELAY_AMT NUMBER(11,2), RECP_YN VARCHAR2(1), RECP_DT VARCHAR2(8), COMM_APPYM VARCHAR2(6), USER_ID VARCHAR2(6), SYS_DT DATE, RECP_TGTAMT NUMBER(11,2), REMARK VARCHAR2(300), PRERECP_AMT NUMBER(11,2), KIJUN_YMD VARCHAR2(8), PRECHG_AMT NUMBER(11,2), TARGET_KBN VARCHAR2(2), PRE_SEQ NUMBER(2), CLOSE_YM VARCHAR2(6), RECV_EMPNO VARCHAR2(6), RECV_ORGCD VARCHAR2(6), IFSEND_DT VARCHAR2(8), IFPROCAN_YN VARCHAR2(1), BPL_CD VARCHAR2(2), DIMENSION1 VARCHAR2(2), DIMENSION2 VARCHAR2(20), DIMENSION3 VARCHAR2(2), DIMENSION4 VARCHAR2(2), DOC_NO VARCHAR2(20), SLIP_NO VARCHAR2(12)

现在是想把tb_789gz里面的数据覆盖到tb_123里面去。

想把里面字段的数据复制进去。如果没有则插入..
-----------------------------------------------------------
实就是想把这些字段更新
----------------------------------------------------------
a.TARGET_AMT=b.TARGET_AMT,a.RECP_AMT=b.RECP_AMT,a.DELAY_AMT=b.DELAY_AMT,a.CLOSE_YM=b.CLOSE_YM,a.INCOME_ORGCD=b.INCOME_ORGCD,a.income_empno=b.income_empno,a.recp_dt=b.recp_dt,a.comm_appym=b.comm_appym,a.Sys_Dt=b.Sys_Dt,a.prerecp_AMT=b.prerecp_AMT,a.prechg_amt=b.prechg_amt,a.doc_no=b. doc_no, a.slip_no=b.slip_no;
---------------------------------------------------------------

使用  MERGE  语句, 可以实现,   如果存在, 则更新,  不存在, 则插入的处理.

 

我看了看,   你那里也是这么用的.

 

问题估计是出在,  你那里 

 

WHEN MATCHED THEN UPDATE SET  ....  

后面多了一个分号。

 

导致 语句执行结束了。

 

 

 

-- 源表
CREATE TABLE test_from (id INT, val VARCHAR(20));
-- 目标表
CREATE TABLE test_to (id INT, val VARCHAR(20));
-- 插入源表
INSERT INTO test_from VALUES (1, 'A');
INSERT INTO test_from VALUES (2, 'B');
-- 合并 源表到目标表
MERGE INTO test_to 
USING test_from
ON ( test_to.id = test_from.id )    -- 条件是 id 相同
WHEN MATCHED THEN UPDATE SET test_to.val = test_from.val   -- 匹配的时候,更新
WHEN NOT MATCHED THEN INSERT VALUES(test_from.id, test_from.val) -- 源表有,目标表没有,插入

-- 第一次检查 目标表数据.
SQL> SELECT * FROM test_to;
        ID VAL
---------- --------------------
         1 A
         2 B
-- 更新源表
UPDATE test_from SET val = 'A2' WHERE id = 1;
-- 删除源表
DELETE FROM test_from WHERE id = 2;
-- 插入源表
INSERT INTO test_from VALUES (3, 'C');

-- 合并 源表到目标表
MERGE INTO test_to 
USING test_from
ON ( test_to.id = test_from.id )    -- 条件是 id 相同
WHEN MATCHED THEN UPDATE SET test_to.val = test_from.val   -- 匹配的时候,更新
WHEN NOT MATCHED THEN INSERT VALUES(test_from.id, test_from.val) -- 源表有,目标表没有,插入

-- 再次检查 目标表数据.
SQL> SELECT * FROM test_to;
        ID VAL
---------- --------------------
         1 A2
         2 B
         3 C

追问

他现在报错ORA-30926:unable to get a stable set of rows in the tables

追答

http://zhidao.baidu.com/link?url=Zh0eLwfXb5FaTmKZQUSE10L3XtSeBi5llzHROAOIEDD4sV1VqLJRNmERJV3Y4KcG3A3gfjdyKkWBvHGDgfASna

追问

你有QQ吗?设置主键都不知道该怎么设置。能帮一下我吗?谢谢le

追答SQL> CREATE TABLE test_tab (
  2    id   INT,
  3    name VARCHAR(10),
  4    age  INT,
  5    val  VARCHAR(10)
  6  );

Table created.


SQL> ALTER TABLE test_tab
  2    ADD CONSTRAINT pk_test_tab PRIMARY KEY(id);
Table altered.

创建主键的例子。

温馨提示:内容为网友见解,仅供参考
无其他回答

两个一样的oracle 数据库怎么实现数据定期同步?
两个一样的oracle ,定期同步,说白了就是主备用数据库数据同步的问题;如果数据库A和数据库B是建立在两台独立的数据库服务器上,那么采用dblink方式是一种可行的方式,第一种方式:前提是数据库A和数据库B本地网是24小时互通的同时对数据同步实时性有比较高的要求,那么可以建立DBLINK,在两个库都建...

oracle 怎样实现两个表同步数据同步
为方便完成指定数据表的同步操作,可以采用dblink与merge结合的方法完成。操作环境: 此数据库服务器ip为192.168.196.76,有center与branch两个库,一般需要将center的表数据同步到branch,center为源库,branch为目标库!

一个Oracle数据库中两张表的数据同步问题
第一个办法中想数据完全同步是不可能的,第二个办法办法稍微靠点谱。如果a,b表的所谓部分数据完全相同,那么可以考虑直接从接口部分得到数据,也就是每半小时,从接口部分得到灌入a表的数据的前100条,这部分数据灌入a表的同时也灌入b表。大概就是这个意思。

oracle 怎样同步两张大表数据,用sql语句实现
1、写个触发器,在a表中insert数据的时候同时在b表中insert。2、写个存储过程,写两个insert语句,将数据同时insert到a表和b表中,在程序中调用存储过程。

关于oracle触发器实现两个表按条件同步数据,大家帮帮忙...
比较常见的trigger错误,你这一句话因为有触发器所以要对同一个表改两次,最好不要用trigger了,直接把处理写到程序里面更好,更容易控制,不容易产生不可预知的后果,或者性能问题。具体语句的话,可以考虑使用pragma autonomous_transaction,但是不建议。

在两个oracle用户中,两个表结构相同的表中数据怎么合并??
赋权限 在a用户下 grant select,insert,update,delete on c to b;在b用户下 insert into c select * from a.c;指的是将a.c里面的所有数据插入到c表中 如果有主键存在的话就必须要过一些过滤,否则会有冲突

如何实现Oracle数据库之间的数据同步
如何实现Oracle数据库之间的数据同步?DataGurd:主要备库的方式,就是数据库对数据库的备份方式,主要是解决容灾的。流复制:主要是利用ORACLE的归档日志,进行增量备份来实现的,不仅可以配置只复制某些表,还可以配置仅复制某些表上的ddl或dml。可以复制到表,用户,数据库级别。高级复制:主要是基于触发...

oracle中如何比较两个表之间所有栏位的数据是否完全相同
Oracle中比对2张表之间数据是否一致的几种方法 大约是2个星期前做一个夜班的时候,开发人员需要比对shareplex 数据同步复制软件在 源端和目标端的2张表上的数据是否一致,实际上后来想了下shareplex 本身应当具有这种数据校验功能, 但是还是希望从数据库的角度得出几种可用的同表结构下的数据比对方法。注意...

Oracle如何实现两个数据库的同步(用实体化视图实现)(Oracle快照...
Oracle如何实现两个数据库的同步(用实体化视图实现)(Oracle快照实例) 一、技术实现细节 除非特别说明,下面的SQL命令都是在数据库ora_db2的SYSETM用户下运行的。假设要复制(或同步)另一服务器上数据库ora_db1中用户db1的所有表。1. 创建一个用于连接数据库1(ora_db1)的数据库连接(dblink)SQL...

ORACLE中 2张类似表进行数据对比,并把值放到另一张表里面进行显示
a2.aaa=b2.aaa) aa2 on aa1.aaa=aa2.aaa inner join ...inner join (select a31.aaa,(case when b31.aaa is null then 0 else 1 end) DATA31 from aaa_ALL a31 left join 20100331 b31 on a31.aaa=b31.aaa) aa31 on aa1.aaa=aa31.aaa 如果aaa不是唯一,上述语句无效。

相似回答