iseries - 返回结果集的java外部存储过程

时间:2015-08-21 16:57:41

标签: java stored-procedures ibm-midrange

我正在尝试构建一个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。

1 个答案:

答案 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。