SQL函数可以调用java方法吗,SQL存储过程或用户定义的函数SQL4306N无法调用Java方法...

我们刚刚从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

说明:

Java方法由CREATE PROCEDURE的EXTERNAL NAME子句给出

或找不到CREATE FUNCTION语句。其声明的论点

列表可能与数据库所期望的不一致,或者它可能不是

“公共”实例方法。

用户响应:

使用“公共”标志和。确保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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值