变得更加艰苦了。
查询 1 很简单,仅涉及 PART 数据。即使这样,我们还是必须写四条 SELECT 语句、 一条 INSERT 语句和一条 DELETE 语句来完成我们的工作。如果您仔细观察从每个后端数 据源检索数据的三条 SELECT 语句,您会看到由于 SQL 方言的差异,这三条语句略有不同 。尤其请注意 DB2 UDB 和 Oracle 在支持检索结果集的前 20 行方面是如何的不同。也要 注意对于 Excel 这项功能不可用。
最后,我们将提到取消限制每个数据源返回的结果集的大小并不总是对的。它对这个查 询的语义没有损害,但是对查询 3 的语义却有损害,我们将在稍后讨论这些。
跨多个数据源的J2EE开发: 细节探讨(7)
时间:2011-04-11 IBM C. M. Saracco
以下是使用直接数据访问来支持查询 1 的 servlet 的 SQL 代码:
// ------------------------- DB2 remote -------------------------
// select for query #1
query1[1]= "SELECT DISTINCT p_partkey, p_name, p_mfgr, p_type " +
"FROM tpcd.part " +
"WHERE p_type LIKE ? " +
"AND p_name LIKE ? " +
"ORDER BY p_partkey " +
"FETCH FIRST 20 ROWS ONLY";
// ------------------------ Oracle remote -----------------------
// select for query #1
query1[2]= "SELECT * FROM (" +
"SELECT p_partkey, p_name, p_mfgr, p_type " +
"FROM part " +
"WHERE p_type LIKE ? " +
"AND p_name LIKE ? " +
"ORDER BY p_partkey" +
") WHERE ROWNUM <= 20";
// ------------------------ Excel local -----------------------
// select for query #1
query1[3]= "SELECT p_partkey, p_name, p_mfgr, p_type " +
"FROM [part$] " +
"WHERE p_type LIKE ? " +
"AND p_name LIKE ?";
// insert statement for intermediate data for query #1
temp_insert[1]= "INSERT INTO temp_query1(p_partkey, p_name,
p_mfgr, p_type) "
+ "VALUES(?, ?, ?, ?)";
// final statement for query #1
temp_select[1]= "SELECT DISTINCT * " +
"FROM temp_query1 " +
"ORDER BY p_partkey " +
"FETCH FIRST 20 ROWS ONLY";
// delete statements for temporary table
temp_delete[1] = "DELETE FROM temp_query1";
查询 2 没有任何特别的问题。从概念上讲,它的实现和查询 1 几乎相同。我们必须写 四条 SELECT 语句、一条 INSERT 语句和一条 DELETE 语句来完成我们的工作。对于其中 的三条 SELECT 语句,我们实际上取用查询 2 的原始版本、用参数标记替换硬编码搜索值 、修改 Excel 数据的 FROM 子句的语法之后这些语句就可以执行了。INSERT 语句只是从 每个数据源取得结果并将它们存放到本地辅助表。我们的第四条 SELECT 语句对该表执行 操作并且该语句的语法是原始查询简略版本。(我们省略了连接和搜索谓词,因为它们已 经在前三条 SELECT 语句中应用了。)最后,我们发出一条简单的 DELETE 语句来清除辅 助表中的内容。
为了保证完整性,我们在下面列出了我们的 servlet 中查询 2 的 SQL 代码。
// ------------------------- DB2 remote -------------------------
// select for query #2
query2[1]= "SELECT ps_partkey, s_name, s_suppkey, MIN(ps_supplycost)
AS min_supplycost " +
"FROM tpcd.partsupp, tpcd.supplier, tpcd.nation " +
"
|