callablestatement to as400无法正常工作

时间:2017-01-31 09:31:24

标签: java lotus-domino ibm-midrange db2-400

在多米诺骨牌服务器上,我有与as400系统的odbc连接。我可以在as400上运行程序并通过以下方式发送输入参数:

var sql:string ="CALL QSYS.QCMDEXC('SBMJOB CMD(CALL PGM(DEMO/TESTDEMO) PARM(ABCDEF)) ',0000000048.00000)";
ps = con.prepareCall(sql);
ps.execute();

很好,有效,但现在我想获得一些数据。 我以为我必须使用callablestatement这样做,所以我尝试了:

var con:Connection = null;
var cs:CallableStatement = null;
try {
  java.lang.Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  var con:java.sql.Connection=java.sql.DriverManager.getConnection(url,usr,pwd);
    sessionScope.error = sessionScope.error +"connection set /";
  var sql:string ="CALL QSYS.QCMDEXC('CALL PGM(DEMO/TESTDEMO) (?,?))";
    sessionScope.error = sessionScope.error +"sql set /";
  cs = con.prepareCall (sql);
    sessionScope.error = sessionScope.error +"cs set /";
  cs.setString (1,'test');
    sessionScope.error = sessionScope.error +"input param set /";
  cs.registerOutParameter (2, Types.VARCHAR);
    sessionScope.error = sessionScope.error +"output param set /";
  cs.execute ();
    sessionScope.error = sessionScope.error +"executed /";
  var retour = cs.getInt (2);
    sessionScope.error = sessionScope.error +"output /"+retour;
  if (cs != null) {cs.close();sessionScope.error = sessionScope.error + "/ cs closed"}
  if (con != null) {con.close();sessionScope.error = sessionScope.error + "/ con closed"}
  }
catch (e){
  sessionScope.error = sessionScope.error+"Sql error ="+e.toString();
  if (cs != null) {cs.close();sessionScope.error = sessionScope.error + "/ cs closed"}
  if (con != null) {con.close();sessionScope.error = sessionScope.error + "/ con closed"}
  return;
}

运行时我得到错误:

  

连接set / sql set / cs set / Sql错误   = java.lang.NullPointerException / cs closed / con closed

所以问题在于设置输入参数。

1 个答案:

答案 0 :(得分:3)

您不能使用QCMDEXC返回值,但IBM i上的任何程序都可以转换为存储过程,然后可以在结果集或参数中返回值。

CREATE PROCEDURE ASSEMBLY_PARTS (IN  ASSEMBLY_NUM  DEC(7,0), 
                                 OUT NUM_PARTS     DEC(7,0), 
                                 OUT COST          DEC(9,2))
      LANGUAGE RPG
      PARAMETER STYLE GENERAL 
      FENCED
      EXTERNAL NAME ASSEMBLY

这为名为ASSEMBLY的RPG程序定义了一个存储过程,其中包含一个输入参数和两个输出参数。这是来自此处的SQL引用的修改示例:https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/db2/rbafzcrtpef.htm

然后,您以与调用QSYS.QCMDEXC存储过程的方式类似的方式调用它。但是这个电话看起来更像是CALL ASSEMBLY_PARTS(ID, PARTS, COST)。这是我现在最接近你的,因为我目前没有Domino测试实例。