Java 使用Spring StoredProcedure类调用函数

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

我试图使用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 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(?,?,?,?) }");
这起作用了。因为这里首先指定了返回值,所以我需要对Spring
StoredProcess
示例执行相同的操作