如何用 JDBC 进行跨库查询
例题描述和简单分析
Oracle数据库中,有 STATEINFO 表,部分数据如下所示:
STATEID |
POPULATION |
AREA |
1 |
4779736 |
52419 |
2 |
710231 |
663267 |
3 |
6392017 |
113998 |
4 |
2915918 |
52897 |
5 |
37253956 |
163700 |
… |
… |
… |
MySQL数据库中,有 STATENAME 表,部分数据如下所示:
STATEID |
NAME |
ABBR |
1 |
Alabama |
AL |
2 |
Alaska |
AK |
3 |
Arizona |
AZ |
4 |
Arkansas |
AR |
5 |
California |
CA |
… |
… |
… |
逻辑上,两表按 STATEID 关联,需要用 JDBC 进行跨库查询,部分结果如下:
STATEID |
POPULATION |
AREA |
NAME |
ABBR |
1 |
4779736 |
52419 |
Alabama |
AL |
2 |
710231 |
663267 |
Alaska |
AK |
3 |
6392017 |
113998 |
Arizona |
AZ |
4 |
2915918 |
52897 |
Arkansas |
AR |
5 |
37253956 |
163700 |
California |
CA |
… |
… |
… |
… |
… |
解法及简要说明
在集算器中编写脚本 p1.dfx,如下所示:
方法一:SPL
A |
|
1 |
=connect("oracle") |
2 |
=A1.query@x("SELECT * FROM STATEINFO") |
3 |
=connect("mysql") |
4 |
=A3.query@x("SELECT * FROM STATENAME") |
5 |
=join(A2:SI,STATEID;A4:SN,STATEID) |
6 |
=A5.new(SI.STATEID,SI.POPULATION,SI.AREA,SN.NAME,SN.ABBR) |
简要说明:
A1 连接数据源名为 oracle 的数据库
A2 执行 SQL,结果返回序表,执行完后关闭数据库连接
A3 连接数据源名为 mysql 的数据库
A4 执行 SQL,结果返回序表,执行完后关闭数据库连接
A5 序表 A2、A4 按关联字段 STATEID 进行关联
A6 生成需要的结果序表
方法二:简单SQL
A |
|
1 |
=connect("mysql").cursor@x("SELECT * FROM STATENAME") |
2 |
=connect("oracle").cursor@x("SELECT * FROM STATEINFO") |
3 |
$select n.STATEID as STATEID,n.POPULATION as POPULATION,n.AREA as AREA,m.NAME as NAME,m.ABBR as ABBR from {A1} m join {A2} n on m.STATEID=n.STATEID |
简要说明:
A1 连接数据源名为 mysql 的数据库,返回根据 sql 创建的数据库游标,关闭游标时自动关闭数据库连接
A2 连接数据源名为 oracle 的数据库,返回根据 sql 创建的数据库游标,关闭游标时自动关闭数据库连接
A3 用简单 SQL 关联两表
JAVA 集成这段代码的方法可参考:《Java 如何调用 SPL 脚本》。
英文版