根据过程是否针对生产数据库运行,调用时,以下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语句中没有该参数的占位符.

请为进一步的例子,考虑例如复习this article,它可能是有帮助的.

Java相关问答推荐

在Spring Boot中测试时出现SQL语法错误

Java Streams在矩阵遍历中的性能影响

Springdoc Whitelabel Error Page with Spring V3

如何在Javascript中设置文本区域圆角的样式

Hibernate 6支持Joda DateTime吗?

RichFaces 3.x-Spring Boot-迁移web.xml

Java:使用Class.cast()将对象转换为原始数组

通过Spring Security公开Spring Boot执行器端点

使用多个RemoteDatabase对象的一个线程

Spring-Boot Kafka应用程序到GraalVM本机映像-找不到org.apache.kafka.streams.processor.internals.DefaultKafkaClientSupplier

Kotlin Val是否提供了与Java最终版相同的可见性保证?

A.ForEach与For(类型a:集合)

将stringBuilder + forloop转换为stream + map

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

为什么JavaFX MediaPlayer音频播放在Windows和Mac上运行良好,但在Linux(POPOS/Ubuntu)上却有问题?

如何制作回文程序?

将@Transactional添加到Spring框架中链下的每个方法会产生什么效果?

ExecutorService:如果我向Executor提交了太多任务,会发生什么?

将天数添加到ZonedDateTime不会更改时间

在JPanel上使用GridBagLayout并将JButton放在里面时出现问题