天天看點

Ibatis調用Oracle存儲過程,以及傳回Cursor結果集的問題

     最近開始接觸oracle了,接觸的越多越感受到自己的渺小!(oracle10g ,ibatis)

   昨天需要通過資料庫查詢一組資料,資料中包含一個表中的一條資料、2個string類型的字元串,想通過oralce的存儲過程實作。

ibatis映射配置:

<parametermap id="parameterdjryid" class="java.util.hashmap" >    

<parameter property="v_ryid" jdbctype="integer" javatype="java.lang.integer" mode="in"/>  //存儲過程傳入參數

<parameter property="pyr_ids" jdbctype="varchar" javatype="java.lang.string" mode="out" />  //存儲過程傳出參數

<parameter property="pyr_xms" jdbctype="varchar" javatype="java.lang.string" mode="out"/>  //存儲過程傳出參數

<parameter property="my_cur" jdbctype="oraclecursor"  javatype="java.sql.resultset" mode="out"/>    //存儲過程傳出參數  

</parametermap>    

<procedure id="p_dj_getryandpyrbyryid"  parametermap="parameterdjryid"  resultclass="java.util.hashmap">    

{call p_dj_getryandpyrbyryid(?)}    //我的存儲過程

</procedure>

service類調用ibatis的代碼:

map parammap = new hashmap();

        parammap.put("v_ryid", primarykey);   

        list <djry> list = dbutil.getobjectlist("t_dj_ry.p_dj_getryandpyrbyryid", parammap);   //這個是我們自己封裝的工具,主要操作ibatis,這裡可以看成ibatis查詢并傳回list結果。

        map<string, object> map = new hashmap<string, object>();  

map.put("pyr_ids", parammap.get("pyr_ids"));    //傳回的兩個參數

map.put("pyr_xms", parammap.get("pyr_xms"));  

map.put("my_cur", list);

至于我的存儲過程就不寫出來了,沒什麼需要特殊寫明的,隻是資料庫的一些關聯查詢,比較麻煩,就不貼出來了。

運作起來後,沒成功。。。。

提示的錯誤資訊要求檢查輸出類型:

--- check the output parameters (register output parameters failed).  

--- cause: java.sql.sqlexception: 無效的列類型

在google上百度了一下,大部分的人問題的原因都是在ibatis映射配置時,傳入傳出的參數中jdbctype與javatype的類型不正确,可是我多番驗證,我的類型是正确的。同時我将傳出的參數一個個的減少,直到沒有傳出參數才能正常運作。真的郁悶了。。。。

經過幾個小時的糾結,終于發現問題的所在了。

在ibatis映射配置中,當我調用存儲過程中,需要使用?進行參數的占位符,而這個參數不能隻寫入參,還要寫出參。。。。

也就是說,我的ibatis映射配置中調用存儲過程的代碼應該這樣寫:

{call p_dj_getryandpyrbyryid(?,?,?,?)}    

欲哭無淚啊!!!!

這樣程式終于運作起來了,生活還要繼續,問題還要繼續産生啊!

現在是能夠在資料庫端将資料傳回了,傳回的結果是2個string類型的字元串,一個結果集。現在我要實作的效果是将結果集給一個list<djry>(djry是我的javabean類),那2個字元串就不用理會了。

可是我怎麼給,djry這個類都不接受!出錯了。。。

糾結一番,明白了。

原來我在ibatis映射配置中,定義的存儲過程的傳回值為hashmap(下面紅色的字型)

{call p_dj_getryandpyrbyryid(?,?,?,?)}    //我的存儲過程

而這個傳回值隻是指我3個傳回值中結果集的傳回值,是以說我傳回的結果集是以hashmap的類型存在的,當我将list中的每一個元素給javabean時,就會發生類型轉換錯誤。

此處需要将定義存儲過程的代碼改為:

<procedure id="p_dj_getryandpyrbyryid"  parametermap="parameterdjryid"  resultmap="djryresult">    

djryresult就是我的ibatis中針對djry定義的resultmap。這樣我就可以将傳回的結果集傳遞給djry的list中進行周遊了。

還有我的parammap中在資料庫操作之前需要将參數存入,在操作資料庫之後,parammap中會存放傳回值中非結果集的參數(包括入參、出參),而在ibatis中定義的出參my_cur其實在parammap中是null值,而list中存放的卻是我的結果集傳回值。是以在擷取傳回的參數時,才會按照下面的方式進行:

這樣也産生了新的問題,當我們在開發過程中,如果要傳回2個結果集(或者說存儲過程中,要傳回2個遊标),又要怎麼處理呢?這個還真沒想到!誰要是知道,互相交流一下啊!

真不容易啊,就這些弄了一天,落後就要折騰啊!