




已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
存儲過程1 CREATE OR REPLACE PROCEDURE 存儲過程名2 IS3 BEGIN4 NULL;5 END;行1:CREATE OR REPLACE PROCEDURE 是一個SQL語句通知Oracle數(shù)據(jù)庫去創(chuàng)建一個叫做skeleton存儲過程, 如果存在就覆蓋它;行2:IS關(guān)鍵詞表明后面將跟隨一個PL/SQL體。行3:BEGIN關(guān)鍵詞表明PL/SQL體的開始。行4:NULL PL/SQL語句表明什么事都不做,這句不能刪去,因?yàn)镻L/SQL體中至少需要有一句;行5:END關(guān)鍵詞表明PL/SQL體的結(jié)束存儲過程創(chuàng)建語法:create or replace procedure 存儲過程名(param1 in type,param2 out type) as 變量1 類型(值范圍); -vs_msgVARCHAR2(4000); 變量2 類型(值范圍);BeginSelect count(*) into 變量1 from 表A where列名=param1; If (判斷條件) then Select 列名 into 變量2 from 表A where列名=param1; Dbms_output。Put_line(打印信息); Elsif (判斷條件) then Dbms_output。Put_line(打印信息); Else Raise 異常名(NO_DATA_FOUND); End if;Exception When others then Rollback;End;注意事項(xiàng):1, 存儲過程參數(shù)不帶取值范圍,in表示傳入,out表示輸出類型可以使用任意Oracle中的合法類型。2, 變量帶取值范圍,后面接分號3, 在判斷語句前最好先用count(*)函數(shù)判斷是否存在該條操作記錄4, 用select 。into。給變量賦值5, 在代碼中拋異常用 raise+異常名CREATE OR REPLACE PROCEDURE存儲過程名(-定義參數(shù)is_ym IN CHAR(6) ,the_count OUT NUMBER,) AS -定義變量 vs_msgVARCHAR2(4000);-錯誤信息變量vs_ym_begCHAR(6);-起始月份vs_ym_endCHAR(6);-終止月份vs_ym_sn_begCHAR(6);-同期起始月份vs_ym_sn_endCHAR(6);-同期終止月份-定義游標(biāo)(簡單的說就是一個可以遍歷的結(jié)果集) CURSOR cur_1 IS SELECT 。 FROM 。 WHERE 。 GROUP BY 。; BEGIN -用輸入?yún)?shù)給變量賦初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHS TO_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_MONTHS(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ù)。 DELETE FROM 表名 WHERE ym = is_ym; -然后用內(nèi)置的DBMS_OUTPUT對象的put_line方法打印出影響的記錄行數(shù),其中用到一個系統(tǒng)變量SQL%rowcount DBMS_OUTPUT.put_line(del上月記錄=|SQL%rowcount|條); INSERT INTO表名(area_code,ym,CMCODE,rmb_amt,usd_amt) SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000 FROM BGD_AREA_CM_M_BASE_T WHERE ym = vs_ym_beg AND ym 0 then begin x := 0 - x; end; end if; if x = 0 then begin x: = 1; end; end if; end test; 2 、For 循環(huán) For . in . LOOP - 執(zhí)行語句 end LOOP; (1) 循環(huán)遍歷游標(biāo) create or replace procedure test() as Cursor cursor is select name from student; name varchar(20); begin for name in cursor LOOP begin dbms_output.putline(name); end; end LOOP; end test; (2) 循環(huán)遍歷數(shù)組 create or replace procedure test(varArray in myPackage.TestArray) as -( 輸入?yún)?shù)varArray 是自定義的數(shù)組類型,定義方式見標(biāo)題6) i number; begin i := 1; - 存儲過程數(shù)組是起始位置是從1 開始的,與java 、C 、C+ 等語言不同。因?yàn)樵贠racle 中本是沒有數(shù)組的概念的,數(shù)組其實(shí)就是一張 - 表(Table), 每個數(shù)組元素就是表中的一個記錄,所以遍歷數(shù)組時(shí)就相當(dāng)于從表中的第一條記錄開始遍歷 for i in 1.varArray.count LOOP dbms_output.putline('The No.'| i | 'record in varArray is:'|varArray(i); end LOOP; end test; 3 、While 循環(huán) while 條件語句 LOOP begin end; end LOOP; E.g create or replace procedure test(i in number) as begin while i 10 LOOP begin i:= i + 1; end; end LOOP; end test; 4 、數(shù)組 首先明確一個概念:Oracle 中本是沒有數(shù)組的概念的,數(shù)組其實(shí)就是一張表(Table), 每個數(shù)組元素就是表中的一個記錄。 使用數(shù)組時(shí),用戶可以使用Oracle 已經(jīng)定義好的數(shù)組類型,或可根據(jù)自己的需要定義數(shù)組類型。 (1) 使用Oracle 自帶的數(shù)組類型 x array; - 使用時(shí)需要需要進(jìn)行初始化 e.g: create or replace procedure test(y out array) is x array; begin x := new array(); y := x; end test; (2) 自定義的數(shù)組類型 ( 自定義數(shù)據(jù)類型時(shí),建議通過創(chuàng)建Package 的方式實(shí)現(xiàn),以便于管理) create or replace package myPackage is Public type declarations type info is record( name varchar(20), y number); type TestArray is table of info index by binary_integer; - 此處聲明了一個TestArray 的類型數(shù)據(jù),其實(shí)其為一張存儲Info 數(shù)據(jù)類型的Table 而已,及TestArray 就是一張表,有兩個字段,一個是name ,一個是y 。需要注意的是此處使用了Index by binary_integer 編制該Table 的索引項(xiàng),也可以不寫,直接寫成:type TestArray is table of info ,如果不寫的話使用數(shù)組時(shí)就需要進(jìn)行初始化:varArray myPackage.TestArray; varArray := new myPackage.TestArray(); end TestArray; 5. 游標(biāo)的使用 Oracle 中Cursor 是非常有用的,用于遍歷臨時(shí)表中的查詢結(jié)果。其相關(guān)方法和屬性也很多,現(xiàn)僅就常用的用法做一二介紹: (1)Cursor 型游標(biāo)( 不能用于參數(shù)傳遞) create or replace procedure test() is cusor_1 Cursor is select std_name from student where .; -Cursor 的使用方式1 cursor_2 Cursor; begin select class_name into cursor_2 from class where .; -Cursor 的使用方式2 可使用For x in cursor LOOP . end LOOP; 來實(shí)現(xiàn)對Cursor 的遍歷 end test; (2)SYS_REFCURSOR 型游標(biāo),該游標(biāo)是Oracle 以預(yù)先定義的游標(biāo),可作出參數(shù)進(jìn)行傳遞 create or replace procedure test(rsCursor out SYS_REFCURSOR) is cursor SYS_REFCURSOR; name varhcar(20); begin OPEN cursor FOR select name from student where . -SYS_REFCURSOR 只能通過OPEN 方法來打開和賦值 LOOP fetch cursor into name -SYS_REFCURSOR 只能通過fetch into 來打開和遍歷 exit when cursor%NOTFOUND; -SYS_REFCURSOR 中可使用三個狀態(tài)屬性: -%NOTFOUND( 未找到記錄信息) %FOUND( 找到記錄信息) -%ROWCOUNT( 然后當(dāng)前游標(biāo)所指向的行位置) dbms_output.putline(name); end LOOP; rsCursor := cursor; end test; 實(shí)例下面寫一個簡單的例子來對以上所說的存儲過程的用法做一個應(yīng)用: 現(xiàn)假設(shè)存在兩張表,一張是學(xué)生成績表(studnet) ,字段為:stdId,math,article,language,music,sport,total,average,step 一張是學(xué)生課外成績表(out_school), 字段為:stdId,parctice,comment 通過存儲過程自動計(jì)算出每位學(xué)生的總成績和平均成績,同時(shí),如果學(xué)生在課外課程中獲得的評價(jià)為A ,就在總成績上加20 分。 create or replace procedure autocomputer(step in number) is rsCursor SYS_REFCURSOR; commentArray myPackage.myArray; math number; article number; language number; music number; sport number; total number; average number; stdId varchar(30); record myPackage.stdInfo; i number; begin i := 1; get_comment(commentArray); - 調(diào)用名為get_comment() 的存儲過程獲取學(xué)生課外評分信息 OPEN rsCursor for select stdId,math,article,language,music,sport from student t where t.step = step; LOOP fetch rsCursor into stdId,math,article,language,music,sport; exit when rsCursor%NOTFOUND; total := math + article + language + music + sport; for i in 1.commentArray.count LOOP record := commentArray(i); if stdId = record.stdId then begin if ment = 'A' then begin total := total + 20; go to next; - 使用go to 跳出for 循環(huán) end; end if; end; end if; end LOOP; average := total / 5; update student t set t.total=total and t.average = average where t.stdId = stdId; end LOOP; end; end autocomputer; - 取得學(xué)生評論信息的存儲過程 cr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考數(shù)學(xué)試題及答案指導(dǎo)
- 印刷幫消防火災(zāi)應(yīng)急預(yù)案(3篇)
- 技術(shù)員信息處理考試的試題與答案的復(fù)盤
- 2025年網(wǎng)絡(luò)全景知識試題及答案
- 網(wǎng)絡(luò)管理員考試重點(diǎn)話題試題及答案
- 2025詳解合同購買合同應(yīng)當(dāng)關(guān)注的法律問題
- 項(xiàng)目溝通與協(xié)調(diào)技巧試題及答案
- 增強(qiáng)自我反思能力的修煉計(jì)劃
- VB語法基礎(chǔ)試題及答案解析
- 行政管理考試的復(fù)習(xí)計(jì)劃及試題及答案
- 2025涼山州繼續(xù)教育公需科目滿分答案-數(shù)字時(shí)代的心理健康
- 浙江百順服裝有限公司年產(chǎn)100萬套服裝及135萬套床上用品生產(chǎn)線項(xiàng)目環(huán)境影響報(bào)告
- 玻璃維修安裝合同協(xié)議
- 2024年中石油招聘考試真題
- 《抽水蓄能電站樞紐布置格局比選專題報(bào)告編制規(guī)程 》征求意見稿
- 校園景觀園林綠化植物配置設(shè)計(jì)
- 2024船用電氣電子產(chǎn)品型式認(rèn)可試驗(yàn)指南
- 融資融券指南
- 糞便DNA檢測研究-全面剖析
- 裝車安全協(xié)議合同
- 大型商業(yè)綜合體火災(zāi)事故處置桌面推演1105
評論
0/150
提交評論