【问题标题】:callablestatement to as400 not workingas400的callablestatement不起作用
【发布时间】:2017-01-31 09:31:23
【问题描述】:

在 domino 服务器上,我有一个到 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;
}

运行时出现错误:

连接设置/sql设置/cs设置/Sql错误 =java.lang.NullPointerException/cs 关闭/con 关闭

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

【问题讨论】:

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


    【解决方案1】:

    您不能使用 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 实例。

    【讨论】:

    • 这个过程必须在 IBM i 上进行?对于给定的示例,如何在 ssjs 中输入和输出数据?
    • @MarcJonkers 存储过程将在服务器上的 DB2 中定义。希望服务器是多年前取代 AS/400 的系统之一。如果它的年龄足以成为真正的“AS/400”,您可能需要帮助创建 SP。
    • 似乎纳粹这个名字出现在 StackOverflow 上。 IBM i 是在 AS/400 上运行的操作系统的新名称。它取代并等效于(有改进的)OS/400Power SystemsPure Systems 是以前称为AS/400 的硬件的新名称。社区中有些人对命名问题持怀疑态度。但是,OS/400Windows 2.0,就像 IBM i v7.3Windows 10。然而,我们仍然称之为Windows。许多人仍然称它为AS/400。注意:AS/400 是与OS/400 密切相关的一揽子交易。现在已经不是这样了。
    • 这是一个现代的IBM i服务器(但我仍然称它为as400,对不起)我可以请我的同事在IBM i服务器上制作这种存储过程,但我仍然不知道如何在 ssjs 的多米诺骨牌端与这个存储过程进行交互。有谁知道吗?
    • 使用 SQL Call 语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多