项目场景:
在多个ORACEL数据库中查询相关联数据并整合,之前使用Java代码进行数据处理,
A表和B表在不同ORACLE数据库中,业务简写如下:
@Getter
@TableName("A")
public class A{
private String pos;
private String name;
}
@Getter
@TableName("B")
public class B{
private String pos;
private String description;
}
@AllArgsConstructor
public class C{
private String pos;
private String name;
private String description;
}
public static void main(String[] args) {
List<A> listA = new ArrayList<>(); //A表查询结果
List<B> listB = new ArrayList<>(); //B表查询结果
List<C> listC = listA.stream().map(a->{
B b = listB.stream().filter(i-> Objects.equals(i.getPos(), a.getPos())).findAny().get();
return new C(a.getPos(),a.getName(), b.getDescription());
}).collect(Collectors.toList());
}
如果在一个数据库中可以用SQL
SELECT A.POS,A.NAME,B.DESCRIPTION
FROM A
LEFT JOIN B
ON A.POS = B.POS
于是寻找多数据库查询的方案
问题描述
执行以下SQL
CREATE PUBLIC DATABSE LINK dblink名称
CONNECT TO 用户 IDENTIFIED BY 密码 USING
'(description=
(address_list=(address=(protocol=tcp)(host=IP)(port=PORT)))
(connect_data=(service_name=SERVICENAME))
)'
依次出现权限不足和密码含有%错误
原因分析:
PUBLIC关键字是给所有用户添加dblink,当前连接用户权限不足就无法给所有用户添加dblink
用户和密码信息可不添加在""
内,但遇到特殊字符不加 ""
无法解析
解决方案:
去掉PUBLIC关键字,只为当前用户创建对其他数据库的dblink
密码添加在""
内
最后实现一条SQL查询不同ORACLE数据库的表
SELECT A.POS,A.NAME,B.DESCRIPTION
FROM A
LEFT JOIN B@dblink名称
ON A.POS = B.POS