【发布时间】:2017-12-26 03:09:42
【问题描述】:
我们刚刚从 9.5 升级到 DB2 10.5,这个过程运行良好,直到在服务器上执行升级。当我从 linux 服务器运行 jar 文件时,出现以下错误,但是当我在 windows 计算机上从 eclipse 运行完全相同的代码时,它工作得很好!如果我从 DB2 控制中心调用这个 sp,我也会收到类似的错误。我想知道是什么原因造成的,我该如何解决这个错误?
SQL4306N Java 存储过程或用户定义函数“ESADBM.GETNEXTID”, 特定名称“WHDBRMM_UTILS”无法调用 Java 方法“GetNextID”, 签名“(Ljava/lang/String;[I)V”。 SQLSTATE=42724
解释:
由 CREATE PROCEDURE 的 EXTERNAL NAME 子句给出的 Java 方法 或找不到 CREATE FUNCTION 语句。它声明的论点 列表可能与数据库期望的不匹配,或者它可能不是 “公共”实例方法。
用户回复:
确保存在带有“public”标志的 Java 实例方法,并且 此调用的预期参数列表。
sqlcode:-4306
sqlstate: 42724.
代码如下:
package pkgUtil_v4_0_0_0;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.hibernate.exception.JDBCConnectionException;
public class DBSequence {
public static final String SEQ_CONTACTID = "ContactIDSeq";
public static final String SEQ_PROJECTID = "ProjectIDSeq";
public static final String SEQ_LOCATIONID = "LocationIDSeq";
public static final String SEQ_SOURCEID = "SourceIDSeq";
public static final String SEQ_SURVEYID = "SurveyIDSeq";
public static final String SEQ_LOGICALSURVEYID = "WageAreaIDSeq";
public static final String SEQ_WAGEDETAILID = "WageDetailIDSeq";
public static final String SEQ_ORGID = "OrgIDSeq";
public static final String SEQ_OFFICEID = "RegionNumberSeq";
public static final String SEQ_LETTERID = "LetterIDSeq";
public static final String SEQ_DODGEID = "DodgeIDSeq";
public static final String SEQ_CRAFTID = "CraftIDSeq";
public static final String SEQ_CRAFTTITLEID = "CraftTitleIDSeq";
public static final String SEQ_ANALYSTID = "AnalystIDSeq";
public static final String SEQ_LETTERTEMPLATEID = "LetterTemplateIDSeq";
public static final String SEQ_RECRATESID = "RecRatesIDSeq";
public static final String SEQ_BRIDGESCDID = "BridgeSCDIDSeq";
public static String drvr = "";
public static Connection con = null;
// utility function
public static int getNextId(Connection lcon, String sequence) throws SQLException {
Boolean bFlag;
PreparedStatement stmt = null;
int id = 0;
String sql = "select next value for esadbm." +
sequence + " from SYSIBM.sysdummy1";
// System.out.println("String = "+sequence);
stmt = lcon.prepareStatement(sql);
ResultSet resultSet = stmt.executeQuery();
if (resultSet.next()) {
id = resultSet.getInt(1);
}
resultSet.close();
stmt.close();
return id;
}
// Stored Procedure Entry Point
public static void getNextId(String sequence, int[] seq) throws SQLException, Exception {
System.out.println("String = "+sequence);
System.out.println("Array = "+seq);
if (drvr.length() == 0) {
drvr = "jdbc:default:connection";
con = DriverManager.getConnection(drvr);
}
drvr = "";
seq[0] = getNextId(con, sequence);
con.close();
}
// test procedure
public static void main(String args[])throws SQLException, Exception {
try {
System.out.println("Connecting to DB " + args[0]);
Class.forName("com.ibm.db2.jcc.DB2Driver");
drvr = "jdbc:db2:" + args[0];
// System.out.println(drvr+args[1] + args[2]);
con = DriverManager.getConnection("jdbc:db2:" + args[0], args[1],args[2]);
// System.out.println(con);
System.out.println("DB Connection Successful");
con = DriverManager.getConnection(drvr, args[1], args[2]);
Statement st = con.createStatement();
String query = "set schema = 'ESADBM'";
st.execute(query);
System.out.println("Getting ID");
int id = getNextId(con, SEQ_SOURCEID);
System.out.println("Returned : " + Integer.toString(id));
}
catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
catch (SQLException sqle) {
sqle.printStackTrace();
}
catch (JDBCConnectionException e) {
System.out.println("Unable to connect to database");
e.printStackTrace();
}
}
}
这是存储过程:
CREATE PROCEDURE "ESADBM "."GETNEXTID"
(
IN SEQUENCE CHARACTER(40),
OUT ID INTEGER
)
DYNAMIC RESULT SETS 0
SPECIFIC WHDBRA_UTILS
EXTERNAL NAME 'pkgUtil_v4_0_0_0.DBSequence!getNextId()'
LANGUAGE JAVA
PARAMETER STYLE JAVA
NOT DETERMINISTIC
FENCED THREADSAFE
MODIFIES SQL DATA
NO DBINFO;
【问题讨论】:
-
不确定“从 linux 服务器运行 [ning] jar 文件”是什么意思,但您需要确保正确安装了包含外部存储过程使用的类的 JAR 文件在服务器上。那么,您执行了哪些步骤来安装它?您的 Java 和 SP 代码在这里完全无关紧要。
-
我们在 linux 服务器上执行 jar 文件。我没有对服务器上的现有设置进行任何修改,因为以前的构建在 DB2 9.5 上工作得很好,只是在升级到 DB2 10.5 后才停止工作。这有意义吗?我一直在研究如何解决这个问题,但到目前为止没有成功。与存储过程相比,方法中传递的参数类型似乎不匹配,或者与类路径有关?
-
Mustaccio,如果您对此了解更多,可以打个电话吗?我在美国东部标准时间。
-
当然,我收取 90 美元/小时的远程咨询费用。我在哪里发送合同?
标签: java db2 java-stored-procedures