最近開始接觸Oracle了接觸的越多越感受到自己的渺小!(oracleg Ibatis)
昨天需要通過數據庫查詢一組數據數據中包含一個表中的一條數據個String類型的字符串想通過Oralce的存儲過程實現
ibatis映射配置
<parameterMap id=parameterDJRYID class=javautilHashMap >
<parameter property=v_ryid jdbcType=INTEGER javaType=javalangInteger mode=IN/> //存儲過程傳入參數
<parameter property=PYR_IDS jdbcType=VARCHAR javaType=javalangString mode=OUT /> //存儲過程傳出參數
<parameter property=PYR_XMS jdbcType=VARCHAR javaType=javalangString mode=OUT/> //存儲過程傳出參數
<parameter property=MY_CUR jdbcType=ORACLECURSOR javaType=javasqlResultSet mode=OUT/> //存儲過程傳出參數
</parameterMap>
<procedure id=P_DJ_GETRYANDPYRBYRYID parameterMap=parameterDJRYID resultClass=javautilHashMap>
{call P_DJ_GETRYANDPYRBYRYID(?)} //我的存儲過程
</procedure>
Service類調用Ibatis的代碼
Map paramMap = new HashMap();
paramMapput(v_ryid primaryKey);
List <DjRy> list = DBUtilgetObjectList(T_Dj_RyP_DJ_GETRYANDPYRBYRYID paramMap); //這個是我們自己封裝的工具主要操作Ibatis這裡可以看成Ibatis查詢並返回List結果
Map<String Object> map = new HashMap<String Object>();
mapput(PYR_IDS paramMapget(PYR_IDS)); //傳回的兩個參數
mapput(PYR_XMS paramMapget(PYR_XMS));
mapput(MY_CUR list);
至於我的存儲過程就不寫出來了沒什麼需要特殊寫明的只是數據庫的一些關聯查詢比較麻煩就不貼出來了
運行起來後沒成功
提示的錯誤信息要求檢查輸出類型
Check the output parameters (register output parameters failed)
Cause: javasqlSQLException: 無效的列類型
在Google上百度了一下大部分的人問題的原因都是在Ibatis映射配置時傳入傳出的參數中jdbcType與JavaType的類型不正確可是我多番驗證我的類型是正確的同時我將傳出的參數一個個的減少直到沒有傳出參數才能正常運行真的郁悶了
經過幾個小時的糾結終於發現問題的所在了
在Ibatis映射配置中當我調用存儲過程中需要使用?進行參數的占位符而這個參數不能只寫入參還要寫出參
也就是說我的Ibatis映射配置中調用存儲過程的代碼應該這樣寫
{call P_DJ_GETRYANDPYRBYRYID(????)}
欲哭無淚啊!!!!
這樣程序終於運行起來了生活還要繼續問題還要繼續產生啊!
現在是能夠在數據庫端將數據返回了返回的結果是個String類型的字符串一個結果集現在我要實現的效果是將結果集給一個list<DjRy>(DjRy是我的Javabean類)那個字符串就不用理會了
可是我怎麼給DjRy這個類都不接受!出錯了
糾結一番明白了
原來我在Ibatis映射配置中定義的存儲過程的返回值為HashMap(下面紅色的字體)
<procedure id=P_DJ_GETRYANDPYRBYRYID parameterMap=parameterDJRYID resultClass=javautilHashMap>
{call P_DJ_GETRYANDPYRBYRYID(????)} //我的存儲過程
</procedure>
而這個返回值只是指我個返回值中結果集的返回值所以說我返回的結果集是以Hashmap的類型存在的當我將list中的每一個元素給javabean時就會發生類型轉換錯誤
此處需要將定義存儲過程的代碼改為
<procedure id=P_DJ_GETRYANDPYRBYRYID parameterMap=parameterDJRYID resultMap=DjRyResult>
{call P_DJ_GETRYANDPYRBYRYID(????)}
</procedure>
DjRyResult就是我的Ibatis中針對DjRy定義的resultMap這樣我就可以將返回的結果集傳遞給DjRy的List中進行遍歷了
還有我的paramMap中在數據庫操作之前需要將參數存入在操作數據庫之後paramMap中會存放返回值中非結果集的參數(包括入參出參)而在ibatis中定義的出參MY_CUR其實在paramMap中是null值而list中存放的卻是我的結果集返回值所以在獲取返回的參數時才會按照下面的方式進行
mapput(PYR_IDS paramMapget(PYR_IDS)); //傳回的兩個參數
mapput(PYR_XMS paramMapget(PYR_XMS));
mapput(MY_CUR list);
這樣也產生了新的問題當我們在開發過程中如果要返回個結果集(或者說存儲過程中要返回個游標)又要怎麼處理呢?這個還真沒想到!誰要是知道互相交流一下啊!
真不容易啊就這些弄了一天落後就要折騰啊!
From:http://tw.wingwit.com/Article/program/Oracle/201311/18047.html