我正在尝试构建一个SP以从远程iSeries返回结果集,而我似乎无法做到这一点。我可以从本地数据库返回结果集,但是当我使用JT400native.jar(也尝试使用jt400.jar)进行连接时,我不能远程返回结果集。任何人都知道我做错了什么?
我的SP定义为此。
CREATE PROCEDURE MYLIB.TEST
(INOUT I INTEGER)
EXTERNAL NAME 'jproc1.returnTEST'
PARAMETER STYLE JAVA
MODIFIES SQL DATA
DYNAMIC RESULT SETS 1
LANGUAGE JAVA
这里有它的java代码,它会将结果集从本地数据库返回给客户端(在iNavigator中运行sql脚本)
import java.sql.*;
import com.ibm.db2.app.*;
public class jproc1 {
public static void returnTEST(int[] myInputInteger, ResultSet[] myResultSet) throws Exception {
Connection con = DriverManager.getConnection("jdbc:default:connection");
Statement stmt1 = con.createStatement();
String sql1 = "select TEST FROM MYLIB.TEST";
myInputInteger[0] = 5;
myResultSet[0] = stmt1.executeQuery(sql1);
}
}
当我将SP更改为将一个连接替换为远程iSeries时,它不会将结果集返回给客户端,但它会返回第一个输出变量myInputInteger就好了。我相信我已经正确设置了所有东西,我有所有需要注册的罐子。这里的重要部分是java程序内部我从远程iSeries获取结果集,我可以遍历它,计算它,将其转储到IFS,它只是不会将它传递回客户端(在iNavigator中运行SQL脚本)。
import java.sql.*;
import com.ibm.db2.app.*;
public class jproc1 {
public static void returnTEST(int[] myInputInteger, ResultSet[] myResultSet) throws Exception {
Class.forName ("com.ibm.as400.access.AS400JDBCDriver").newInstance ();
String url = "jdbc:as400://remoteiseries;naming=sql;prompt=false;user=myuser;password=mypass;translate binary=true";
Connection con = DriverManager.getConnection(url);
Statement stmt1 = con.createStatement();
String sql1 = "select TEST FROM MYLIB.TEST";
myInputInteger[0] = 5
myResultSet[0] = stmt1.executeQuery(sql1);
}
}
那么,我错过了什么?我尝试了很多变化,包括使用DB2GENERAL参数类型(以及DB2 UDB for iSeries手册中每章7对java程序的相应更改)。无论我做什么,都不会将这些远程结果集返回给客户,我也不会有任何错误。
TIA。
答案 0 :(得分:0)
什么版本的IBM i?
DB2 for IBM i长期以来一直支持联邦支持......
仅在最近,v7.1 TR 4,才有可能做到
insert into localtbl
select * from remotetbl
但你还是做不到
select * from localtbl join remotetbl using (key)
由于系统在作业中一次只支持一个数据库连接。
有趣的是,这个article提供了一种使用UDTF来绕过一个连接限制的技术。我不太了解内部因素,以了解为什么UDTF会起作用,但SP不会。但您可以尝试从SP更改为UDTF。