尝试从Java调用简单Oracle PROCEDURE的索引无效



下面的SQL块成功地显示了"Y";或";N〃;当基于过程是否针对生产数据库运行而调用时。

DECLARE
v_is_prod VARCHAR2(1);
BEGIN
FDS_APPS.FDS_USR_SEC_PKG2.IS_RUNNING_IN_PRODUCTION2(v_is_prod);
dbms_output.put_line('v_is_prod=' || v_is_prod);
END;

我正在尝试从Java调用这个过程(这是我第一次调用(。对于这个问题,请忽略这可能是一个返回char而不是单个输出varchar2(1(参数的函数。我正在迈出小步。

这是我的Java代码:

public String isRunningInProduction() throws DaoException {

LoggerUtil.info("Start calling [" + IS_RUNNING_IN_PRODUCTION + "]::", LOGGER);
String inProduction = "";

try {
SqlOutParameter isProd = new SqlOutParameter("v_is_prod", OracleTypes.VARCHAR);
List<SqlParameter> paramList = new ArrayList<SqlParameter>();
paramList.add(isProd); 

Map<String, Object> resultMap = jdbcTemplate.call(new CallableStatementCreator() {
public OracleCallableStatement createCallableStatement(Connection connection) throws SQLException {
OracleCallableStatement callableStatement = (OracleCallableStatement) connection
.prepareCall(IS_RUNNING_IN_PRODUCTION);

callableStatement.registerOutParameter(1, Types.VARCHAR);
return callableStatement;
}
}, paramList);
inProduction = (String)resultMap.get("v_is_prod");

} catch (Exception e) {
LOGGER.error("Error while determining if running in prod or not, PROC_NAME::[" + IS_RUNNING_IN_PRODUCTION + "]," + e);
throw new DaoException("Error while retreiving " + IS_RUNNING_IN_PRODUCTION + e);
}
LoggerUtil.info("Finished calling [" + IS_RUNNING_IN_PRODUCTION + "]::", LOGGER);

return inProduction;    

}

我得到这个错误:

org.springframework.jdbc.InvalidResultSetAccessException: CallableStatementCallback; invalid ResultSet access for SQL []; nested exception is java.sql.SQLException: Invalid column index

显然,registerOutParameter是基于1的,因此callableStatement似乎不是问题所在,第一个参数的索引为1。

以下常量在其他地方定义:

public static final String IS_RUNNING_IN_PRODUCTION = "FDS_APPS.FDS_USR_SEC_PKG2.is_running_in_production2";

对我的问题有什么建议吗?

问题是,您需要在语句中指出需要一个参数,如下所示:

public static final String IS_RUNNING_IN_PRODUCTION = "FDS_APPS.FDS_USR_SEC_PKG2.is_running_in_production2(?);";

通常,该语句被封装在call调用中:

public static final String IS_RUNNING_IN_PRODUCTION = "{call FDS_APPS.FDS_USR_SEC_PKG2.is_running_in_production2(?)}";

请注意括号和?字符。

在Java和JDBC中,您需要使用?字符为SQL语句中所需的每个参数提供一个占位符,无论它是In还是OUT。

由于您在示例中没有提供这样的占位符,Spring正在抱怨,因为您正试图用索引1注册一个out参数——没错,第一列索引是1-,但SQL语句中没有该参数的占位符。

为了获得更多的例子,请考虑例如回顾这篇文章,它可能会有所帮助。

最新更新