as400 的可调用语句不工作
callablestatement to as400 not working
在 domino 服务器上,我有一个 odbc 连接到 as400 系统。我可以 运行 as400 上的程序并通过 :
发送输入参数
var sql:string ="CALL QSYS.QCMDEXC('SBMJOB CMD(CALL PGM(DEMO/TESTDEMO) PARM(ABCDEF)) ',0000000048.00000)";
ps = con.prepareCall(sql);
ps.execute();
很好,很有效,但现在我想取回一些数据。
我认为我必须使用可调用语句来执行此操作,所以我尝试了:
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;
}
当 运行 宁这个我得到错误:
connection set /sql set /cs set /Sql error
=java.lang.NullPointerException/ cs closed/ con closed
所以问题出在输入参数的设置上
您不能使用 QCMDEXC return 值,但 IBM i 上的任何程序都可以转换为存储过程,然后可以在结果集或参数中 return 值。
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 实例。
在 domino 服务器上,我有一个 odbc 连接到 as400 系统。我可以 运行 as400 上的程序并通过 :
发送输入参数var sql:string ="CALL QSYS.QCMDEXC('SBMJOB CMD(CALL PGM(DEMO/TESTDEMO) PARM(ABCDEF)) ',0000000048.00000)";
ps = con.prepareCall(sql);
ps.execute();
很好,很有效,但现在我想取回一些数据。 我认为我必须使用可调用语句来执行此操作,所以我尝试了:
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;
}
当 运行 宁这个我得到错误:
connection set /sql set /cs set /Sql error =java.lang.NullPointerException/ cs closed/ con closed
所以问题出在输入参数的设置上
您不能使用 QCMDEXC return 值,但 IBM i 上的任何程序都可以转换为存储过程,然后可以在结果集或参数中 return 值。
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 实例。