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

时间:2016-02-22 17:45:20

标签: 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() 
        {
            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的值。

1 个答案:

答案 0 :(得分:1)

这看起来像是一个oracle bug。事实证明,命名参数(":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;
            }
        }
    );  

看起来oracle specs也说要避免使用setXXX方法 -

  

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

有关该问题的更多详情 - > http://info.michael-simons.eu/2012/07/23/oracle-jbdc-callablestatements-and-named-parameters/