oracle存儲(chǔ)過(guò)程語(yǔ)法_第1頁(yè)
oracle存儲(chǔ)過(guò)程語(yǔ)法_第2頁(yè)
oracle存儲(chǔ)過(guò)程語(yǔ)法_第3頁(yè)
oracle存儲(chǔ)過(guò)程語(yǔ)法_第4頁(yè)
oracle存儲(chǔ)過(guò)程語(yǔ)法_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余14頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、存儲(chǔ)過(guò)程1CREATEORREPLACEPROCEDURE 存儲(chǔ)過(guò)程名2|lS3BEGIN4NULL;5END;行 1:CREATEORREPLACEPROCEDURE 是一個(gè)SQL 語(yǔ)句通知 Oracle 數(shù)據(jù)庫(kù)去創(chuàng)建一個(gè)叫做 skeleton 存儲(chǔ)過(guò)程,如果存在就覆蓋它;行 2:IS 關(guān)鍵詞表明后面將跟隨一個(gè) PL/SQL 體。行 3:BEGIN 關(guān)鍵詞表明 PL/SQL 體的開(kāi)始。行 4:NULLPL/SQL 語(yǔ)句表明什么事都不做,這句不能刪去,因?yàn)镻L/SQL 體中至少需要有一句;行 5:END 關(guān)鍵詞表明 PL/SQL 體的結(jié)束createorreplaceprocedure 存儲(chǔ)過(guò)

2、程名(paramlintype,param2outtype)as變量 1 類型(值范圍);-vs_msgVARCHAR2(4000);變量 2 類型(值范圍);BeginSelectcount(*)into 變量 1from 表 Awhere 列名=param1;If(判斷條件)thenSelect 列名 into 變量 2from 表 Awhere 列名=param1;Dbms_outputoPut_line(打印信息);Elsif(判斷條件)thenDbms_outputoPut_line(打印信息);ElseRaise 異常名(NO_DATA_FOUND);Endif;Exception

3、WhenothersthenRollback;End;注意事項(xiàng):1,存儲(chǔ)過(guò)程參數(shù)不帶取值范圍,in 表示傳入,out 表示輸由類型可以使用任意 Oracle 中的合法類型。2,變量帶取值范圍,后面接分號(hào)3,在判斷語(yǔ)句前最好先用 count(*)函數(shù)判斷是否存在該條操作記錄4,用 select。into。給變量賦值5,在代碼中拋異常用 raise+異常名CREATEORREPLACEPROCEDURE 存儲(chǔ)過(guò)程名(-定義參數(shù)is_ymINCHAR(6),the_countOUTNUMBER,)AS-定義變量vs_msgVARCHAR2(4000);-錯(cuò)誤信息變量vs_ym_begCHAR(6);

4、-起始月份vs_ym_endCHAR(6);-終止月份vs_ym_sn_begCHAR(6);-同期起始月份vs_ym_sn_endCHAR(6);-同期終止月份-定義游標(biāo)(簡(jiǎn)單的說(shuō)就是一個(gè)可以遍歷的結(jié)果集)CURSORcur_1ISSELECT。FROMWHERE。GROUPBY;BEGIN-用輸入?yún)?shù)給變量賦初值,用到了 Oralce 的 SUBSTRTO_CHARADD_MONTHSTO_DATE 等很常用的函數(shù)。vs_ym_beg:=SUBSTR(is_ym,1,6);vs_ym_end:=SUBSTR(is_ym,7,6);vs_ym_sn_beg:=TO_CHAR(ADD_MONT

5、HS(TO_DATE(vs_ym_beg,yyyymm),-12),yyyymm);vs_ym_sn_end:=TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,yyyymm),-12),yyyymm);-先刪除表中特定條件的數(shù)據(jù)。DELETEFROM 表名 WHEREym=is_ym;-然后用內(nèi)置的 DBMS_OUTPUT對(duì)象的 put_line方法打印由影響的記錄行數(shù),其中用到一個(gè)系統(tǒng)變量 SQL%rowcountDBMSOUTPUT.putline(del 上月記錄=|SQL%rowcount|條);INSERTINTO 表名(area_code,ym,CMCOD

6、E,rmb_amt,usd_amt)SELECTarea_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000FROMBGD_AREA_CM_M_BASE_TWHEREym=vs_ym_begANDym0thenbeginx:=0-x;end;endif;ifx=0thenbeginx:=1;end;endif;endtest;2、For 循環(huán)For.in.LOOP-執(zhí)行語(yǔ)句endLOOP;(1)循環(huán)遍歷游標(biāo)createorreplaceproceduretest()asCursorcursorisselectnamefromstude

7、nt;namevarchar(20);beginfornameincursorLOOPbegindbms_output.putline(name);end;endLOOP;endtest;(2)循環(huán)遍歷數(shù)組createorreplaceproceduretest(varArrayinmyPackage.TestArray)as-(輸入?yún)?shù) varArray 是自定義的數(shù)組類型,定義方式見(jiàn)標(biāo)題 6)inumber;begini:=1;-存儲(chǔ)過(guò)程數(shù)組是起始位置是從 1 開(kāi)始的,與 java、C、C+等語(yǔ)言不同。因?yàn)樵?Oracle 中本是沒(méi)有數(shù)組的概念的,數(shù)組其實(shí)就是一張-表(Table),每個(gè)數(shù)

8、組元素就是表中的一個(gè)記錄,所以遍歷數(shù)組時(shí)就相當(dāng)于從表中的第一條記錄開(kāi)始遍歷foriin1.varArray.countLOOPdbms_output.putline('TheNo.'|i|'recordinvarArrayis:'|varArray(i);endLOOP;endtest;3、While 循環(huán)while 條件語(yǔ)句 LOOPbeginend;endLOOP;E.gcreateorreplaceproceduretest(iinnumber)asbeginwhilei10LOOPbegini:=i+1;end;e

9、ndLOOP;endtest;首先明確一個(gè)概念:Oracle 中本是沒(méi)有數(shù)組的概念的,數(shù)組其實(shí)就是一張表(Table),每個(gè)數(shù)組元素就是表中的一個(gè)記錄。使用數(shù)組時(shí),用戶可以使用 Oracle 已經(jīng)定義好的數(shù)組類型,或可根據(jù)自己的需要定義數(shù)組類型。(1)使用 Oracle 自帶的數(shù)組類型xarray;-使用時(shí)需要需要進(jìn)行初始化e.g:createorreplaceproceduretest(youtarray)isxarray;beginx:=newarray();y:=x;endtest;(2)自定義的數(shù)組類型(自定義數(shù)據(jù)類型時(shí),建議通過(guò)創(chuàng)建 Package 的方式實(shí)現(xiàn),以便于管理)creat

10、eorreplacepackagemyPackageisPublictypedeclarationstypeinfoisrecord(namevarchar(20),ynumber);typeTestArrayistableofinfoindexbybinary_integer;-此處聲明了一個(gè) TestArray 的類型數(shù)據(jù),其實(shí)其為一張存儲(chǔ)Info 數(shù)據(jù)類型的 Table 而已,及 TestArray 就是一張表,有兩個(gè)字段 , 一 個(gè) 是 name, 一 個(gè) 是 y。需 要 注 意 的 是 此 處 使 用 了Indexbybinary_integer 編制該 Table 的索引項(xiàng),也可以

11、不寫,直接寫成:typeTestArrayistableofinfo,如果不寫的話使用數(shù)組時(shí)就需要進(jìn)行初始化:varArraymyPackage.TestArray;varArray:=newmyPackage.TestArray();endTestArray;5.游標(biāo)的使用 Oracle 中 Cursor 是非常有用的,用于遍歷臨時(shí)表中的查詢結(jié)果。其相關(guān)方法和屬性也很多,現(xiàn)僅就常用的用法做一二介紹:(1)Cursor 型游標(biāo)(不能用于參數(shù)傳遞)createorreplaceproceduretest()iscusor_1Cursorisselectstd_namefromstudentwhe

12、re.;-Cursor 的使用方式 1cursor_2Cursor;beginselectclass_nameintocursor_2fromclasswhere.;-Cursor 的使用方式 2可使用 ForxincursorLOOP.endLOOP;來(lái)實(shí)現(xiàn)對(duì)Cursor 的遍歷endtest;(2)SYS_REFCURSOR 型游標(biāo),該游標(biāo)是 Oracle 以預(yù)先定義的游標(biāo),可作由參數(shù)進(jìn)行傳遞createorreplaceproceduretest(rsCursoroutSYS_REFCURSOR)iscursorSYS_REFCURSOR;namevarhcar(20);beginOPE

13、NcursorFORselectnamefromstudentwhere.-SYS_REFCURSOR 只能通過(guò) OPEN 方法來(lái)打開(kāi)和賦值LOOPfetchcursorintoname-SYS_REFCURSOR 只能通過(guò) fetchinto來(lái)打開(kāi)和遍歷 exitwhencursor%NOTFOUND;-SYS_REFCURSOR 中可使用三個(gè)狀態(tài)屬性:-%NOTFOUND(未找至 U 記錄信息)%FOUND(找到記錄信息)-%ROWCOUNT(然后當(dāng)前游標(biāo)所指向的行位置)dbms_output.putline(name);endLOOP;rsCursor:=cursor;endtest;實(shí)

14、例下面寫一個(gè)簡(jiǎn)單的例子來(lái)對(duì)以上所說(shuō)的存儲(chǔ)過(guò)程的用法做一個(gè)應(yīng)用:現(xiàn)假設(shè)存在兩張表,一張是學(xué)生成績(jī)表(studnet),字段為:stdId,math,article,language,music,sport,total,average,step一張是學(xué)生課外成績(jī)表(out_school),字段為:stdId,parctice,comment通過(guò)存儲(chǔ)過(guò)程自動(dòng)計(jì)算由每位學(xué)生的總成績(jī)和平均成績(jī),同時(shí),如果學(xué)生在課外課程中獲得的評(píng)價(jià)為 A,就在總成績(jī)上加 20 分。createorreplaceprocedureautocomputer(stepinnumber)isrsCursorSYS_REFCURS

15、OR;commentArraymyPackage.myArray;mathnumber;articlenumber;languagenumber;musicnumber;sportnumber;totalnumber;averagenumber;stdIdvarchar(30);recordmyPackage.stdInfo;inumber;begini:=1;etcomment(commentArray);get_comment()的存儲(chǔ)過(guò)程獲取學(xué)生課外評(píng)分信息OPENrsCursorforselectstdId,math,article,language,music,sportfromst

16、udenttwheret.step=step;LOOPfetchrsCursorinto調(diào)用名為stdId,math,article,language,music,sport;exitwhenrsCursor%NOTFOUND;total:=math+article+language+music+sport;mentArray.countLOOPrecord:=commentArray(i);ifstdId=record.stdIment='A'thenbegintotal:=total+20;gotonext;-使用 goto 跳由 for 循環(huán)end;e

17、ndif;end;endif;endLOOP;average:=total/5;updatestudenttsett.total=totalandt.average=averagewheret.stdId=stdId;endLOOP;end;endautocomputer;-取得學(xué)生評(píng)論信息的存儲(chǔ)過(guò)程createorreplaceprocedureget_comment(commentArrayoutmyPackage.myArray)isrsSYS_REFCURSOR;recordmyPackage.stdInfo;stdIdvarchar(30);commentvarchar(1);inumber;beginopenrsforselectstdId,commentfromout_schooli:=1;LOOPfetchrsintostdId,comment;exitwhenrs%NO

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論