




已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
存儲(chǔ)過程1 CREATE OR REPLACE PROCEDURE 存儲(chǔ)過程名2 IS3 BEGIN4 NULL;5 END;行1:CREATE OR REPLACE PROCEDURE 是一個(gè)SQL語(yǔ)句通知Oracle數(shù)據(jù)庫(kù)去創(chuàng)建一個(gè)叫做skeleton存儲(chǔ)過程, 如果存在就覆蓋它;行2:IS關(guān)鍵詞表明后面將跟隨一個(gè)PL/SQL體。行3:BEGIN關(guān)鍵詞表明PL/SQL體的開始。行4:NULL PL/SQL語(yǔ)句表明什么事都不做,這句不能刪去,因?yàn)镻L/SQL體中至少需要有一句;行5:END關(guān)鍵詞表明PL/SQL體的結(jié)束存儲(chǔ)過程創(chuàng)建語(yǔ)法:create or replace procedure 存儲(chǔ)過程名(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, 存儲(chǔ)過程參數(shù)不帶取值范圍,in表示傳入,out表示輸出類型可以使用任意Oracle中的合法類型。2, 變量帶取值范圍,后面接分號(hào)3, 在判斷語(yǔ)句前最好先用count(*)函數(shù)判斷是否存在該條操作記錄4, 用select 。into。給變量賦值5, 在代碼中拋異常用 raise+異常名CREATE OR REPLACE PROCEDURE存儲(chǔ)過程名(-定義參數(shù)is_ym IN CHAR(6) ,the_count OUT NUMBER,) AS -定義變量 vs_msgVARCHAR2(4000);-錯(cuò)誤信息變量vs_ym_begCHAR(6);-起始月份vs_ym_endCHAR(6);-終止月份vs_ym_sn_begCHAR(6);-同期起始月份vs_ym_sn_endCHAR(6);-同期終止月份-定義游標(biāo)(簡(jiǎn)單的說就是一個(gè)可以遍歷的結(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對(duì)象的put_line方法打印出影響的記錄行數(shù),其中用到一個(gè)系統(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í)行語(yǔ)句 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; - 存儲(chǔ)過程數(shù)組是起始位置是從1 開始的,與java 、C 、C+ 等語(yǔ)言不同。因?yàn)樵贠racle 中本是沒有數(shù)組的概念的,數(shù)組其實(shí)就是一張 - 表(Table), 每個(gè)數(shù)組元素就是表中的一個(gè)記錄,所以遍歷數(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 條件語(yǔ)句 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ù)組 首先明確一個(gè)概念:Oracle 中本是沒有數(shù)組的概念的,數(shù)組其實(shí)就是一張表(Table), 每個(gè)數(shù)組元素就是表中的一個(gè)記錄。 使用數(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; - 此處聲明了一個(gè)TestArray 的類型數(shù)據(jù),其實(shí)其為一張存儲(chǔ)Info 數(shù)據(jù)類型的Table 而已,及TestArray 就是一張表,有兩個(gè)字段,一個(gè)是name ,一個(gè)是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)對(duì)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 中可使用三個(gè)狀態(tài)屬性: -%NOTFOUND( 未找到記錄信息) %FOUND( 找到記錄信息) -%ROWCOUNT( 然后當(dāng)前游標(biāo)所指向的行位置) dbms_output.putline(name); end LOOP; rsCursor := cursor; end test; 實(shí)例下面寫一個(gè)簡(jiǎn)單的例子來對(duì)以上所說的存儲(chǔ)過程的用法做一個(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 通過存儲(chǔ)過程自動(dòng)計(jì)算出每位學(xué)生的總成績(jī)和平均成績(jī),同時(shí),如果學(xué)生在課外課程中獲得的評(píng)價(jià)為A ,就在總成績(jī)上加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() 的存儲(chǔ)過程獲取學(xué)生課外評(píng)分信息 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é)生評(píng)論信息的存儲(chǔ)過程 cr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)小蜂年度中國(guó)肉類生產(chǎn)及分布數(shù)據(jù)分析報(bào)告
- 2025年工業(yè)互聯(lián)網(wǎng)平臺(tái)SDN優(yōu)化與5G通信技術(shù)在工業(yè)互聯(lián)網(wǎng)中的應(yīng)用報(bào)告
- 2025年農(nóng)業(yè)灌溉用水高效利用與水資源優(yōu)化配置報(bào)告
- 2025年綠色供應(yīng)鏈管理在調(diào)味品制造業(yè)的應(yīng)用與推廣研究報(bào)告
- 智能礦山無人作業(yè)系統(tǒng)在煤炭開采中的應(yīng)用研究與發(fā)展報(bào)告
- 2025年線下演出市場(chǎng)復(fù)蘇后的經(jīng)濟(jì)效益與社會(huì)影響研究報(bào)告
- 基于區(qū)塊鏈技術(shù)的2025年零售企業(yè)數(shù)字化供應(yīng)鏈協(xié)同安全報(bào)告
- 06年司法局上半年工作總結(jié)
- 2025年裝配式建筑部品部件生產(chǎn)流程優(yōu)化與標(biāo)準(zhǔn)化創(chuàng)新案例分析報(bào)告
- 核電項(xiàng)目日常管理制度
- 智慧社區(qū)人臉識(shí)別門禁系統(tǒng)改造方案
- 小學(xué)生反洗錢知識(shí)講座
- 痛風(fēng)結(jié)石病人的術(shù)后護(hù)理
- 室內(nèi)拆除及裝修方案
- 養(yǎng)殖業(yè)技術(shù)知識(shí)培訓(xùn)課件
- 慢性傷口護(hù)理中的柔性可穿戴設(shè)備應(yīng)用
- 學(xué)生心理健康一生一策檔案表
- 2025年商洛柞水縣城鄉(xiāng)供水有限公司招聘筆試參考題庫(kù)含答案解析
- 浙江首考2025年1月普通高等學(xué)校招生全國(guó)統(tǒng)考政治試題及答案
- 實(shí)訓(xùn)美容手術(shù)操作基本技術(shù)美容外科學(xué)概論講解
- 學(xué)校消防安全管理與突發(fā)事件處置
評(píng)論
0/150
提交評(píng)論