資源描述:
《oracle存儲(chǔ)過程調(diào)用實(shí)踐》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、一直以來,存儲(chǔ)過程就是一個(gè)心病啊,都不知道到底什么東西。不過幸好在別人的帶領(lǐng)下,戰(zhàn)勝了這個(gè)恐懼,算是小小的入門了。(oracle的sql叫做pl-sql,在語法上和m-sql有一些不同的地方。而且,由于java和Oracle的密切關(guān)系,所以oracle較高版本的pl-sql中也出現(xiàn)一些類似于面向?qū)ο缶幊痰恼Z法結(jié)構(gòu)。)現(xiàn)在把我遇到的各種錯(cuò)誤列出來,當(dāng)然我有l(wèi)og,要不然我都記不住了。1.ORA-00921:unexpectedendofSQLcommand基本sql錯(cuò)誤2.badSQLgrammar基本sql錯(cuò)誤3.wrongnumberortypesofargumentsincallt
2、o***調(diào)用存儲(chǔ)過程傳入的參數(shù)不對(duì)4.weblogic.jdbc.wrapper.Array_oracle_sql_ARRAY?使用的是weblogic容器提供的ARRAY,不能直接轉(zhuǎn)化成ORACLE的ARRAY,但是可以用java.sql下面的接口。5.?identifier***mustbedeclared?數(shù)據(jù)庫中沒有定義這個(gè)名字的存儲(chǔ)過程6.ORA-03115:unsupportednetworkdatatypeorrepresentation存儲(chǔ)過程傳入的參數(shù)類型不支持??在pl-sql中有package,可以用來定義訪問變量的自定義類型,但是返回的類型除了游標(biāo)以外,都不能被
3、外部,如jdbc來訪問。都會(huì)提示類型不知道的錯(cuò)誤,不管你有沒有加上表空間的名字。而這個(gè)時(shí)候需要用全局的類型來定義。全局的類型,主要分為三種:1.createorreplacetypeobj_1asobject(**number,**number,**varchar2(36),**varchar2(150));2.createorreplacetypetab_1astableofobj_1;1.createorreplacetypearray_1ASVARRAY(21)OFobj_1;這幾種類型都可以作為返回值,而且,后兩種類型,常??梢砸远嗑S數(shù)組的形式返回。在java中可以這樣取值:?
4、??????????????proc.execute();???????????????java.sql.Arrayarr=proc.getArray(2);???????????????Object[]strcs=(Object[])arr.getArray();???????????????Object[]objs;???????????????for(Objectstrct:strcs){???????????????????objs=((java.sql.Struct)strct).getAttributes();???????????????????bean=new**();
5、???????????????????bean.set**(((BigDecimal)objs[0]).intValue());???????????????????bean.set**(((BigDecimal)objs[1]).intValue());???????????????????bean.set**((String)objs[2]);???????????????????bean.set**((String)objs[3]);???????????????????beans.add(bean);???????????????}這里要注意,雖然利用的是Oracle的tabl
6、e或者varray,但是返回類型都用java.sql.Array接口來表示就好了,不要用具體的實(shí)現(xiàn)類,因?yàn)閷?shí)現(xiàn)類通常在服務(wù)器的環(huán)境中,本地的classpath中根本沒有配置。如果存儲(chǔ)過程中的有多個(gè)查詢,比如兩個(gè),第一個(gè)查詢查詢一個(gè)list出來,第二個(gè)查詢要遍歷這個(gè)list,分別查詢,然后組裝成一個(gè)ARRAY的形式,就可以利用上面的三個(gè)類型中的1,2或者1,3即可。值得注意的是,oracle的面向?qū)ο筇攸c(diǎn),所以,當(dāng)你要在ARRAY擴(kuò)充之后插入一行時(shí),可以先利用對(duì)象的構(gòu)造函數(shù)new一次行對(duì)象。如newoj_1(f1,f2,f3),這是它默認(rèn)的構(gòu)造函數(shù),你也可以自定義函數(shù)?,F(xiàn)在有兩個(gè)表A(i
7、dvarchar(15),c_idvarchar(20))其中id是主鍵B(c_idvarchar(20),c_name1varchar(100),c_name2varchar(100),c_name3varchar(120),date...)其中c_id是主鍵假設(shè)現(xiàn)在有一個(gè)查詢,首先從A表中通過id查詢一列的c_id然后利用c_id查詢出對(duì)應(yīng)的c_id,c_name1,c_name2.--創(chuàng)建對(duì)象createorreplacetypeMY_I