使用JDBC callable语句从Java调用oracle存储过程时,绑定参数的顺序不正确

使用JDBC callable语句从Java调用oracle存储过程时,绑定参数的顺序不正确,java,stored-procedures,jdbc,plsql,oracle11g,Java,Stored Procedures,Jdbc,Plsql,Oracle11g,以下是使用绑定参数从java发出的oracle proc调用- String GET_TEST_ID = "{call PKG_TEST.prc_gettestid(:PARAM1, :PARAM2, :PARAM3, :OUTPARAM1)}"; String id = (String)getJdbcTemplate().execute ( GET_TEST_ID, new CallableStatementCallback() { p

以下是使用绑定参数从java发出的oracle proc调用-

String GET_TEST_ID = "{call PKG_TEST.prc_gettestid(:PARAM1, :PARAM2, :PARAM3, :OUTPARAM1)}";

String  id = (String)getJdbcTemplate().execute
    (   GET_TEST_ID, new CallableStatementCallback() 
        {
            public Object doInCallableStatement(CallableStatement callableStatement) throws SQLException, DataAccessException 
            {
                callableStatement.registerOutParameter("OUTPARAM1", java.sql.Types.VARCHAR);
                callableStatement.setLong("PARAM1", param1);
                callableStatement.setLong("PARAM2", param2);
                callableStatement.setLong("PARAM3", param3);
                callableStatement.execute();
                String testId = callableStatement.getString(OUTPARAM1); 
                return testId;
            }
        }
    );  

但它似乎不起作用。在记录值的过程中,我在PARAM2中得到PARAM1的值,在PARAM3中得到PARAM2的值。

这在我看来像是oracle的错误。事实证明,命名参数(“:PARAM1”)毕竟不是这样命名的,但设置它们的顺序确实很重要

String  id = (String)getJdbcTemplate().execute
    (   GET_TEST_ID, new CallableStatementCallback() 
        {
            public Object doInCallableStatement(CallableStatement callableStatement) throws SQLException, DataAccessException 
            {
                callableStatement.setLong("PARAM1", param1);
                callableStatement.setLong("PARAM2", param2);
                callableStatement.setLong("PARAM3", param3);
                callableStatement.registerOutParameter("OUTPARAM1", java.sql.Types.VARCHAR); //register last as it is 4th in proc argument
                callableStatement.execute();
                String testId = callableStatement.getString(OUTPARAM1);
                return testId;
            }
        }
    );  
看起来还说要避免setXXX方法-

使用setXXX方法时不支持按名称绑定。在某些情况下,以前版本的Oracle JDBC驱动程序在使用setXXX方法时允许按名称绑定语句变量


有关此问题的更多详细信息->

JDBC规范不支持命名绑定变量(即使Oracle驱动程序似乎对它们有一些未记录的支持);要使用的正确绑定占位符是
。传递给
setXY()的参数名称
method是过程声明中指定的参数名称,而不是绑定占位符的名称。@MickMemonic但CallableStatement中有一个方法
void setString(String parameterName,String x)