当前位置: 首页 > 知识库问答 >
问题:

Spring集成-未能检索Oracle Array OUT PARAM

孟晨朗
2023-03-14

描述:尝试创建返回oracle阵列类型的网关服务调用。特别是获取sys.dbmsoutput\u linesarray。当我注册OUT参数或可能在服务中注册OUT参数时,下面出现的错误似乎是我的配置有问题。想知道是否有人能告诉我做错了什么?

错误消息:CallableStatementCallback;SQL的未分类SQLException[{call GET\u DBMS\u OUTPUT(?)}];SQL状态[99999];错误代码[17004];无效列类型:1111;嵌套的异常是java.sql。SQLException:无效列类型:1111

引用代码示例我试图在Spring集成中做:JAVA DBMS ORACLE ARRAY CALLABLE STATEMENT示例

Oracle 12c-PLSQL功能:

create or replace function get_dbms_output
    return dbmsoutput_linesarray
as
    l_output dbmsoutput_linesarray;
    l_linecount number;
begin
    dbms_output.enable;
        dbms_output.put_line('This is a line');
        dbms_output.put_line('This is another line');
        dbms_output.put_line('This is the last line.');


    dbms_output.get_lines(l_output, l_linecount);

    if l_output.count > l_linecount then
        -- Remove the final empty line above l_linecount
        l_output.trim;
    end if;

    return l_output;
end get_dbms_output;

Spring上下文文件-取自Spring集成git hub示例存储过程-oracle。示例代码使用以下出站网关进行了扩展。

<bean id="sqlReturnArray" class="org.springframework.data.jdbc.support.oracle.SqlReturnArray"></bean>

<int-jdbc:stored-proc-outbound-gateway
    id="outbound-gateway-function-dbms" request-channel="procedureDBMSRequestChannel"
    data-source="dataSource" 
    stored-procedure-name="get_dbms_output"
    expect-single-result="true">

    <int-jdbc:sql-parameter-definition name="l_output" type="#{T(oracle.jdbc.OracleTypes).ARRAY}"  type-name="DBMSOUTPUT_LINESARRAY" direction="OUT" return-type="sqlReturnArray" />

</int-jdbc:stored-proc-outbound-gateway>

JAVA更新的字符串转换服务

public interface StringConversionService {

    /**
     * Converts a String to Upper Case.
     *
     * @param stringToConvert The string to convert to upper case
     * @return The converted upper case string.
     */
    String convertToUpperCase(String stringToConvert);

    Integer getNumber();

    @Payload("new java.util.Date()")
    String[] getLines();
}

JAVA-主

final StringConversionService service = context.getBean(StringConversionService.class);

        System.out.println("Calling Stored Proc");
        String[] dbmsLines = service.getLines();

更新:Spring配置:-为SqlReturnArray添加了一个bean。-添加了对SqlReturnArray bean的引用的返回类型-将StringConversionService更改为使用字符串[],而不是oracle数组返回类型。-更新了主类以获取字符串[]

共有1个答案

袁卓
2023-03-14

您必须添加report-type并以某种方式实现它,就像SqlReportnArray一样:

<int-jdbc:sql-parameter-definition name="l_output" type="#{T(oracle.jdbc.OracleTypes).ARRAY}"  type-name="DBMSOUTPUT_LINESARRAY" direction="OUT" return-type="sqlReturnArray" />

其中,sqlReturnArray是sqlReturnArray的一个bean

当然,已经将结果处理为String[],而不是那里不可用的ARRAY

 类似资料:
  • 本文向大家介绍Dubbo 能集成 Spring Boot 吗?相关面试题,主要包含被问及Dubbo 能集成 Spring Boot 吗?时的应答技巧和注意事项,需要的朋友参考一下 可以的,项目地址如下。 https://github.com/apache/incubator-dubbo-spring-boot-project  

  • 我是spring集成和缓存新手,想知道如何将从出站网关接收到的对象添加到缓存中。无法确定所需的配置。 从以下配置,我从rest api收到的对象正在被记录: INFO:com.domain.IpAddress@74589991 我计划使用ehcache/caffiene,任何提示都会有帮助。 编辑2: 现在,我按照建议更改了出站网关: 并将ehache配置定义如下: 在我的服务类中,定义了可缓存的

  • 最后,在使用Spring Data REST和QueryDSL时,是否可以显示正确的分页链接?如果是,怎么做?

  • 我有以下2个组件,它们应该首先从Mongo中删除文档,然后从Elastic中删除。 主要流程: 服务: 不幸的是,deleteDocumentInMongo从未被调用。我可以在日志中看到bean已正确注册。 我是做错了什么,还是你需要更多的调试信息?如果我窃听手柄,则deleteDocumentInES。执行输入,但忽略mongo流。

  • Spring提供了特殊的类DelegatingVariableResolver,以无缝方式将JSF和Spring集成在一起。 在JSF中集成Spring依赖注入(IOC)功能需要以下步骤。 第1步:添加DelegatingVariableResolver 在faces-config.xml中添加一个variable-resolver条目,指向spring类DelegatingVariableRes