以下是来自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的值。
答案 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/