使用JDBC callable语句从Java调用oracle存储过程时,绑定参数的顺序不正确
以下是使用绑定参数从java发出的oracle proc调用-使用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
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)
。