2017-02-19 44 views
3

說明:試圖創建一個返回oracle數組類型的網關服務調用。特別是獲取sys.dbmsoutput_linesarray。我在下面看到的錯誤似乎是我在註冊OUT參數或可能在服務中時在配置上有問題。想知道如果有人能告訴我我做錯了什麼?彈簧集成 - 未能檢索Oracle陣列輸出參數

錯誤消息: CallableStatementCallback;未分類SQLException for SQL [{call GET_DBMS_OUTPUT(?)}]; SQL狀態[99999];錯誤代碼[17004];無效的列類型:1111;嵌套的異常是java.sql.SQLException中:無效的列類型:1111

引用的代碼示例我想在春天整合做: JAVA DBMS ORACLE ARRAY CALLABLE STATEMENT EXAMPLE

甲骨文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 Context File - 從spring集成git集線器示例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 []

回答

1

您必須添加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的豆。

當然,處理結果爲String[]已經,不是不可用ARRAY

+0

你是否總是使用OUT PARAMS的返回類型?它在示例中似乎並不總是使用它。那是因爲Spring使用封面下的JDBC元數據來確定返回的內容嗎?像varchar或數字一樣。 – haju

+0

不,您必須將它用於非標準,複雜類型 –

+0

增加了spring-data-jdbc-core 1.2。現在得到一個彈簧上下文錯誤現在添加上面。 設置參數時無法解析對bean'#{new org.springframework.data.jdbc.support.oracle.SqlReturnArray()}'的引用; org.springframework.expression.spel.SpelEvaluationException:EL1003E :(pos 0 ):嘗試使用參數'()'構造'org.springframework.data.jdbc.support.oracle.SqlReturnArray'類型的對象時發生問題' – haju