Java 使用Spring StoredProcedure类调用函数
我试图使用Java和Spring调用OracleDB函数。有很多例子。此代码库使用的是Spring版本4.2.13.0。这是我的密码:Java 使用Spring StoredProcedure类调用函数,java,spring,oracle,Java,Spring,Oracle,我试图使用Java和Spring调用OracleDB函数。有很多例子。此代码库使用的是Spring版本4.2.13.0。这是我的密码: public void someMethod(Long oldUserId, Long newUserId, String loginId, Long profileId) throws Exception { class MyFunction extends StoredProcedure { public MyF
public void someMethod(Long oldUserId, Long newUserId, String loginId, Long profileId) throws Exception
{
class MyFunction extends StoredProcedure
{
public MyFunction (DataSource ds)
{
setDataSource(ds);
setFunction(true);
setSql("myschema.f_m_user");
// this function takes 4 input arguments and returns 1 output parameter.
declareParameter(new SqlParameter("par_login_id", Types.VARCHAR));
declareParameter(new SqlParameter("par_old_user_id", Types.NUMERIC));
declareParameter(new SqlParameter("par_new_user_id", Types.NUMERIC));
declareParameter(new SqlParameter("par_user_profile_id", Types.NUMERIC));
declareParameter(new SqlOutParameter("returnValue", Types.VARCHAR));
compile();
}
public String execute(String parLoginId, Long parCurUserId, Long parNewUserId, Long parProfileId)
{
//Map inParams = new HashMap();
//inParams.put("par_login_id", parLoginId);
//inParams.put("par_old_user_id", parCurUserId);
//inParams.put("par_new_user_id", parNewUserId);
//inParams.put("par_user_profile_id", parProfileId);
//Map result = execute(inParams);
Map result = super.execute(parLoginId, parCurUserId, parNewUserId, parProfileId);
String errorMsg = null;
if (!result.isEmpty() && result.get("returnValue") != null)
{
errorMsg = result.get("returnValue").toString();
}
return errorMsg;
}
} // end class
MyFunction func = new MyFunction (ds);
String errorMsg = func.execute(
loginId,
oldUserId,
newUserId,
profileId);
if (errorMsg != null)
{
throw new Exception(errorMsg);
}
}
这对我不起作用,因为传递给DB函数的参数不符合我指定的顺序。我试过两种不同的方法。使用映射调用execute,并使用可变数量的参数调用execute(请参见代码)。令人惊讶的是,这两种方法对我都不成功。我觉得我缺少了一些简单的东西,或者Oracle方面对函数声明有问题。以下是Oracle功能的签名:
CREATE OR REPLACE FUNCTION myschema.f_m_user
-- Returns the oracle error message
(
par_login_id IN profile.login_id%TYPE,
par_old_user_id IN profile.user_id%TYPE,
par_new_user_id IN profile.user_id%TYPE,
par_user_profile_id IN profile.mod_profile_id%TYPE
)
RETURN VARCHAR2
IS
BEGIN … more code not shown
DB函数确实会被调用,但传递的参数顺序不正确。我能够解决这个问题。显然,declareParameter(…)语句的顺序很重要。我想我在文件里漏掉了这个信息。更正后的代码为:
declareParameter(new SqlOutParameter("returnValue", Types.VARCHAR));
declareParameter(new SqlParameter("par_login_id", Types.VARCHAR));
declareParameter(new SqlParameter("par_old_user_id", Types.NUMERIC));
declareParameter(new SqlParameter("par_new_user_id", Types.NUMERIC));
declareParameter(new SqlParameter("par_user_profile_id", Types.NUMERIC));
compile();
我将returnValue语句移到in参数之前。我可以通过构建另一个示例来解决这个问题,但使用了一个如下所示的prepareCall:
stmt = conn.prepareCall("{? = call utility.f_m_user(?,?,?,?) }");
这起作用了。因为这里首先指定了返回值,所以我需要对Spring
StoredProcedure
示例执行相同的操作。。显然,declareParameter(…)语句的顺序很重要。我想我在文件里漏掉了这个信息。更正后的代码为:
declareParameter(new SqlOutParameter("returnValue", Types.VARCHAR));
declareParameter(new SqlParameter("par_login_id", Types.VARCHAR));
declareParameter(new SqlParameter("par_old_user_id", Types.NUMERIC));
declareParameter(new SqlParameter("par_new_user_id", Types.NUMERIC));
declareParameter(new SqlParameter("par_user_profile_id", Types.NUMERIC));
compile();
我将returnValue语句移到in参数之前。我可以通过构建另一个示例来解决这个问题,但使用了一个如下所示的prepareCall:
stmt = conn.prepareCall("{? = call utility.f_m_user(?,?,?,?) }");
这起作用了。因为这里首先指定了返回值,所以我需要对SpringStoredProcess
示例执行相同的操作