本次,介绍一下GBase8a MPP中dblink的语法约束。
在使用GBase8a MPP的dblink,可以很方便的从远方异构数据库中查询数据,比如在GBase8a MPP中,从Mysql数据库中查询某个数据库实例中的数据。但是,因为毕竟是异构数据库,所以不能完全像查询本地数据库那样,支持非常复杂的查询结构。总结起来,以下几种场景下,是无法进行数据查询的。
一、同源的dblink表可以直接join,dblink表禁止与local table,relation subquery,非同源dblink表产生直接join关系。
如下的语句是可以支持的
t1@gc_link join t2@gc_link 是支持的,因为都是在远端数据库进行查询
t1@gc_link join t2 是不允许的,会出现语法错误,即无法将远端数据库的表和本地表进行join操作
二、dblink表的子查询中,禁止出现本地表,非同源dblink表
如下的语句是不被支持的
select * from t1@gc_link where exists (select 1 from t2)
因为db-link表 t1@gc_link 的子查询中,出现了本地表t2
可以改写成如下的格式:
select * from (select * from t1@gc_link) t where exists (select 1 from t2)
三、group by 或 order by 中的相关子查询,禁止出现db-link表
如下的语句是不被支持的
select count(*) from t2 group by (select max(id) from test1@oracle_linke1);
四、不支持对dblink表进行ddl,dml
以下的语法是不被支持的
drop table test1@oracle_link1;
alter table test@oracle_link1 add column name varchar(20);
五、不支持在函数中,使用dblink表
以下的函数写法是不被支持的
create function fn_dblink_oracle () returns int
begin
select count(*)/5 into @count from (select * from test1@oracle_link1) tt;
return @count;
end
delimiter;
六、不支持对dblink表show create和desc操作
以下的语法是不被支持的
desc test1@oracle_link1;
show create table test1@oracle_link1;
虽然从语法上,dblink存在一些限制,但是对一些基本操作来说,还是非常便利的,推荐可以尝试一下。