数据分布式插入

最近,在做分布式插入这块,发现和集中式插入有些不同。先说下背景,我们的目的是要把一个企业的集中式数据存储转换成分布式数据存储,企业的数据是表的形式,每个表数据量很大,每个表之间相互关联,也就是海量的关系型数据。通过对表进行分片,也就是水平分片、垂直分片、混合分片,然后分配到分布式站点上,这一块具体怎么做就不叙述了。这样就算是针对这个企业的分布式存储做好了,但要在这个分布式上对数据的增删改查当然无法实现,所有要编写相关的组件,来实现查出具体的分片和站点,然后对数据操作。这样也需要说下,分布式框架是有中心站点+底层站点组成,中心站点作用是接收应用程序的请求语句,找出具体的分片和站点;底层站点是存储数据,接收中心站点调度。

为了实现起来简单,就在中心站点上Oracle数据库和底层站点Oracle数据库分别建立dblink(这里也要说下我们是基于.net+oracle开发的),这样把语句丢给中心站点执行就ok了。其实如果不用dblink来实现的话,我也不知道该怎么实现?哪个个大牛知道请指教!

扯了这么多背景,转入正题,分布式插入和集中式插入有哪些不同呢?因为我这分布式插入是在中心站点Oracle数据库用dblink语句实现的,所有一定要用到dblink。先写一条语句:insert all into table1 (id,name,typevalues(id,state,applyid) select id,state,applyid from table2,这条插入语句在集中式是能执行的。在分布式中,查询table1的分片和站点,然后重新生成一组插入语句(因为符合插入要求的分片都需要插入,并且副本也需要插入),当然源表我也在底层站点数据库上备份了,我就拿生成的源表插入语句来举例,insert all into table1@site4_link (id,name,typevalues(id,state,applyid) select id,state,applyid from table2@site4_link,这条是分布式中对源表进行插入的语句,table1和table2在站点site4上,site4_link是在中心站点上建立与site4的远程连接,说到这问题就来了,这条语句在中心站点应该可以执行的呀,但仍给中心站点数据库执行,报错ORA-02021: 不允许对远程数据库进行 DDL 操作,这我就纳闷了,insert语句明明就是dml操作,怎么爆出ddl错误,难以理解。正当我百思不得其解时候,我执行这样一条插入语句,

insert into table1@site4_link (id,name,typeselect id,state,applyid from table2@site4_link,却能执行,我当然喜出望外,毕竟dblink还是可以用的。那之前插入语句不能执行,是不是多了个all关键字呢?当我拿着insert into table1@site4_link (id,name,typevalues(id,state,applyid) select id,state,applyid from table2@site4_link执行时,我失望了,告诉我ORA-00933: SQL 命令未正确结束。基于这样的情况,我得出一个可能不准确的结论:前提是用dblink情况下,插入语句若有all关键字,则不能用dblink,所有不加all关键字;如果有select和values关键字,出现sql不正确错误,则把values关键字去掉,是可以执行的;如果只有values没有select,也是可以执行;当然没有select则必须要有values,才能有插入的值;所以说select和values这两个关键字二者只能存在一种;在集中式数据库执行语句insert into table1(needcode,depart,id,addtime) values(1111,2233,46,to_date('2013-9-9','yyyymm-dd')) into table2(id,state,applyid,needtime) values(67,1,123,to_date('2013-9-9','yyyy-mm-dd'));ORA-00933: SQL 命令未正确结束,在集中式数据库执行语句insert all into table1(id,depart) values(id,acceptformcode) into table2(id,state) values(id,acceptformcode) select id,acceptformcode from table3 where id=44,是可以执行的。说明只有包含select关键字才能多表插入。当然在dblink情况下,包含select的多表插入也是不能执行的,因为不含all和values关键字的多表插入逻辑上就行不通,事实执行也出错了。

所以综述所述:

前提在是用dblink情况下插入,插入语句若有all关键字,则不能用dblink,所有不加all关键字;如果有select和values关键字,出现sql不正确错误,则把values关键字去掉,是可以执行的;如果只有values没有select,也是可以执行;当然没有select则必须要有values,才能有插入的值;所以说select和values有且只有一个关键字存在;不支持多表插入;貌似只有包含子查询,才能多表插入,但包含了子查询的话,有不能用values,也无法多表插入;其实我也不知道Oracle机制为什么这么设置,如果insert all into table1@site4_link (id,name,typevalues(id,state,applyid) select id,state,applyid from table2@site4_link这条语句能执行的话,我也不需要去掉all和values部分,可能是安全机制把。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值