我认为查看IPS_DB.GET_SEQUENCE_NUMBER 过程的定义和返回的准确SQLCODE 会很有用。
例如如果我使用错误数量(或不兼容的)参数执行CALL MYSP(...),那么com.ibm.db2.jcc.am.SqlSyntaxErrorException 也会被抛出:
DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=MULTIPLY_BY_THREE;PROCEDURE, DRIVER=3.72.52
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=MULTIPLY_BY_THREE;PROCEDURE, DRIVER=3.72.52
at com.ibm.db2.jcc.am.b1.a(b1.java:813)
at com.ibm.db2.jcc.am.b1.a(b1.java:66)
at com.ibm.db2.jcc.am.b1.a(b1.java:140)
at com.ibm.db2.jcc.am.kj.c(kj.java:2790)
at com.ibm.db2.jcc.am.kj.d(kj.java:2778)
at com.ibm.db2.jcc.am.kj.a(kj.java:2222)
at com.ibm.db2.jcc.am.kk.a(kk.java:7643)
at com.ibm.db2.jcc.t4.ab.i(ab.java:148)
at com.ibm.db2.jcc.t4.ab.e(ab.java:77)
at com.ibm.db2.jcc.t4.p.d(p.java:63)
at com.ibm.db2.jcc.t4.av.m(av.java:185)
at com.ibm.db2.jcc.am.kj.ak(kj.java:2217)
at com.ibm.db2.jcc.am.kk.bn(kk.java:3602)
at com.ibm.db2.jcc.am.kk.a(kk.java:4460)
at com.ibm.db2.jcc.am.CallableStatement.b(CallableStatement.java:128)
at com.ibm.db2.jcc.am.CallableStatement.a(CallableStatement.java:103)
at com.ibm.db2.jcc.am.CallableStatement.execute(CallableStatement.java:93)
从 SQLCODE 中我可以得知没有找到匹配的例程:
db2 ? sqln440
SQL0440N No authorized routine named "<routine-name>" of type
"<routine-type>" having compatible arguments was found.
这意味着代码本身是可以的。
这是CallableStatement 执行的工作示例:
- SP 定义:
db2 "create or replace procedure multiply_by_two(in input int, out output int)
language sql
set output = input*2"
- 代码:
import java.sql.*;
import java.util.*;
import com.ibm.db2.jcc.*;
public class so
{
public static void main(String [] args)
{
String url;
CallableStatement cstmt;
Connection c;
Properties props = new Properties();
if (args.length != 5)
{
System.out.println("USAGE: java so db_name hostname portnum username password");
return;
}
url = "jdbc:db2://"+args[1]+":"+args[2]+"/" + args[0];
try
{
Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();
props.put("user",args[3]);
props.put("password",args[4]);
c = DriverManager.getConnection(url,props);
cstmt = c.prepareCall("CALL MULTIPLY_BY_TWO(?,?)");
cstmt.setInt(1,10);
cstmt.registerOutParameter(2, Types.INTEGER);
cstmt.execute();
int out = cstmt.getInt(2);
System.out.println("MULTIPLY_BY_TWO returned: " + out);
cstmt.close();
}
catch (Exception e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("Execution complete.");
}
}
- 编译:
~/sqllib/java/jdk64/bin/javac so.java
- 执行:
~/sqllib/java/jdk64/bin/java so sample localhost 60111 db2v111 passw0rd
MULTIPLY_BY_TWO returned: 20
Execution complete.