java - Spring Integration - 无法检索 Oracle 数组 OUT PARAM

标签 java spring-integration

描述:尝试创建返回 oracle 数组类型的网关服务调用。专门获取 sys.dbmsoutput_linesarray。当我注册 OUT 参数或可能在服务中时,我得到的错误似乎是我的配置有问题。想知道是否有人可以告诉我我做错了什么?

错误信息: 可调用语句回调; SQL 的未分类 SQLException [{call GET_DBMS_OUTPUT(?)}]; SQL状态[99999];错误代码 [17004];列类型无效:1111;嵌套异常是 java.sql.SQLException:无效的列类型:1111

我尝试在 spring 集成中做的引用代码示例: JAVA DBMS ORACLE ARRAY CALLABLE STATEMENT EXAMPLE

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 示例 stored-procedure-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 更改为使用 String[] 而不是 oracle Array 返回类型。 - 更新了主类以获取 String[]

最佳答案

你必须添加 return-type 并像 SqlReturnArray 一样实现它:

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

sqlReturnArraySqlReturnArray 的 bean。

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

关于java - Spring Integration - 无法检索 Oracle 数组 OUT PARAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42324142/

相关文章:

Java `final` 类和模拟

java - 以编程方式访问 JPA <persistence-unit-metadata>

java - 如何使用 Java 和 JNI 修改传递给 C++ 例程的原始数据的值?

spring - 收到消息后如何停止轮询? Spring 集成

java - 如何修复 NoSuchMethodError?

java - 调用返回结果集的方法

java - Soap 消息调用 Web 服务时的 NullPointer

java - Spring 集成 ip - 仅使用 java 代码的 udp channel

java - 尚未为 channel 适配器定义轮询器