Java Spring集成-检索Oracle阵列输出参数失败

Java Spring集成-检索Oracle阵列输出参数失败,java,spring-integration,Java,Spring Integration,说明:尝试创建返回oracle阵列类型的网关服务调用。特别是获取sys.dbmsoutput_linesarray。当我注册OUT参数或可能在服务中注册OUT参数时,下面出现的错误似乎表明我的配置有问题。不知是否有人能告诉我我做错了什么 错误消息: CallableStatementCallback;SQL[{call GET_DBMS_OUTPUT(?)}]的未分类SQLException;SQL状态[99999];错误代码[17004];无效列类型:1111;嵌套异常为java.sql.SQ

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

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

我在spring集成中尝试执行的参考代码示例:

Oracle 12c-PL SQL函数:

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-MAIN

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

        System.out.println("Calling Stored Proc");
        String[] dbmsLines = service.getLines();
更新: 弹簧配置: -为SqlReturnArray添加了一个bean。 -添加了对SqlReturnArray bean的引用的返回类型 -将StringConversionService更改为使用字符串[]而不是oracle数组返回类型。 -更新主类以获取字符串[]

您必须添加并以某种方式实现它,如:


其中
sqlReturnArray
是该
sqlReturnArray
的一个bean


当然,将结果处理为一个
字符串[]
,而不是一个不可用的
数组

您是否总是必须为OUT参数使用返回类型?在示例中,它似乎并不总是使用它。这是因为Spring在封面下使用JDBC元数据来确定返回的内容吗?不,您必须将它用于非标准、复杂类型的spring数据JDBCCore1.2。现在得到一个spring上下文错误,现在将其添加到上面。无法解析对bean“#{new org.springframework.data.jdbc.support.oracle.SqlReturnArray()}”的引用。。。在设置参数时;org.springframework.expression.spel.SpelEvaluationException:EL1003E:(位置0):尝试构造“org.springframework.data.jdbc.support.oracle.SqlReturnArray”“using arguments”“()”类型的对象时出现问题哦!对不起,我的错。这应该是一个bean引用。我编辑了我的回答,但仍然得到了与我最初在帖子中相同的错误。我用我们讨论过的编辑更新了我的原始帖子。您提到将结果作为字符串[]处理。这应该是服务调用的返回类型吗?或者应该是数组之类的东西?
final StringConversionService service = context.getBean(StringConversionService.class);

        System.out.println("Calling Stored Proc");
        String[] dbmsLines = service.getLines();
<int-jdbc:sql-parameter-definition name="l_output" type="#{T(oracle.jdbc.OracleTypes).ARRAY}"  type-name="DBMSOUTPUT_LINESARRAY" direction="OUT" return-type="sqlReturnArray" />