2012-09-20 77 views
0

我在Oracle中創建了一個用戶類型現在聲明通過Java類

create or replace type my_array_list 
is 
table of 
varchar2(100); 

我寫具有輸出參數是這樣一個過程OUT參數:

type my_list_rec IS record 
    (
     best_friends my_array_list, 
     good_friends my_array_list 
    ); 


    type my_list_array is table of my_list_rec; 

    procedure friends_diff_prc(my_name in varchar2, 
            my_friend_list_o out my_list_array , 
            rc_o     out number); 

現在我打電話這個過程通過我的JAVA類擴展爲StoredProcedure

// Declare output parameter 
declareParameter(new SqlOutParameter(
       PropertiesReader 
         .getPropertyValue(FRIENDSConstants.GET_FRIEND_LIST_OUT), 
       OracleTypes.ARRAY,"MYDB.MY_ARRAY_LIST")); 

但是,當我打電話一個進程,我得到

org.springframework.jdbc.BadSqlGrammarException: 

我是正確的聲明OUT參數? 而我如何解析輸出參數的內容?

在此先感謝。

回答

1

你的例子令人驚訝的混淆。您有意地命名爲兩種類型是非常相似的名字很不同:

  • my_array_listSQL類型:VARCHAR2的嵌套表
  • my_list_arrayPL/SQL類型:my_array_list
記錄的表

PL/SQL和SQL類型在物理上非常不同。例如,PL/SQL types can't be accessed directly through jdbc

此外,這兩種類型在邏輯上是非常不同的:我看不出你怎麼想象將第一種類型映射到第二種類型。第二種類型是第一種類型的對象的集合,永遠不能交換這兩種類型。

我建議如下:

  1. 不名稱與混淆性相似的名稱非常不同的類型。
  2. 用PL/SQL過程的SQL對象創建一個包裝過程,以便能夠從jdbc調用它。
  3. 請參閱以下示例,以SQL參數調用過程作爲OUT參數:Fetch Oracle table type from stored procedure using JDBC
+0

你能告訴我們關於你的第二個建議嗎? – vikiiii

+0

您無法直接從java調用具有PLSQL類型的過程。因此,您需要修改過程來獲取SQL類型,或者您可以構建將進行轉換的包裝器PLSQL過程。例如,PL/SQL記錄將被轉換爲SQL對象。在你的情況下,因爲你有一個表的記錄表(哎!),你的包裝可以採取兩個SQL數組,例如,使一個表與兩個數組中的一個記錄。 –