PLSQL程序設(shè)計(jì)(基礎(chǔ)篇)



《PLSQL程序設(shè)計(jì)(基礎(chǔ)篇)》由會(huì)員分享,可在線閱讀,更多相關(guān)《PLSQL程序設(shè)計(jì)(基礎(chǔ)篇)(49頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、PL/SQL程序?設(shè)計(jì)(上冊(cè)) 寫在前面 之所以不怕?麻煩把有關(guān)?PL/SQL的知?識(shí)寫下來(lái),一方面,是為了加深?理解,便于以后隨?時(shí)翻閱,另一方面,是因?yàn)樽约?看書總是不?能從頭看到?尾,仔仔細(xì)細(xì),喜歡跳躍式?閱讀,導(dǎo)致學(xué)習(xí)過(guò)?程中,容易有遺漏?。所以,將學(xué)習(xí)到的?知識(shí)總結(jié)起?來(lái),方便監(jiān)督自?己,方便大家查?閱。 本文所記錄?的內(nèi)容當(dāng)然?不是本人憑?經(jīng)驗(yàn)而寫,而是學(xué)習(xí)的?筆記,參考的資料?以《Oracl?e9i PLSQL? Funda?menta?ls》和《Oracl?e9i Devel?op PLSQL? Progr?am Units? 》為核心,其次,還包括《精通Ora?cle
2、10?g PLSQL?編程》和《Oracl?e PLSQL? Best Pract?ices》等。 由于是學(xué)習(xí)?筆記么,說(shuō)是教程,其實(shí)是在吸?引大家的注?意,呵呵,主要是想在?方便大家查?閱和入門者?入門外,希望大家多?多指教,多多提出意?見(jiàn),共同把這塊?知識(shí)學(xué)熟、學(xué)通、學(xué)透。 Quasa?r Wei’s Email?: quasa?rbrav?e@gmail?.com Quasa?r Wei’s QQ: 73408?9783 Quasa?r Wei’s Real Name: WeiZh?aozhe? of NEU 目錄 PL/SQL程序?設(shè)計(jì)(上冊(cè)) 1 第一章
3、認(rèn)識(shí)PL/SQL 3 第二章 SQL回顧? 5 第三章PL?/SQL的基?本結(jié)構(gòu) 7 第四章PL?/SQL的數(shù)?據(jù)類型及使?用 10 第五章 流程控制 29 第六章 游標(biāo) 35 第七章 異常處理 46 第八章 下冊(cè)預(yù)知 49 第一章 認(rèn)識(shí)PL/SQL 這一章主要?記錄了兩個(gè)?問(wèn)題:1 什么是PL?/SQL? 2 PL/SQL有什?么優(yōu)勢(shì)?下面從這兩?個(gè)問(wèn)題展開(kāi)?論述。 什么是PL?/SQL? PL/SQL即p?roced?ural langu?age/stand?ard query? langu?age, PL/SQL是具?備程序設(shè)計(jì)?語(yǔ)言特性(如:定義變量、流程控制
4、、面向?qū)ο蟮?)的、關(guān)系數(shù)據(jù)庫(kù)?標(biāo)準(zhǔn)查詢語(yǔ)?言SQL的?過(guò)程性拓展?(proce?dural? exten?sion)。 SQL是非?過(guò)程語(yǔ)言,非過(guò)程,讓我理解,就是不用你?了解語(yǔ)句的?處理過(guò)程,而直接達(dá)到?開(kāi)發(fā)者的目?的。如:selec?t name from stude?nt這條語(yǔ)?句,就是向數(shù)據(jù)?庫(kù)說(shuō):“我要學(xué)生的?姓名”,然后數(shù)據(jù)庫(kù)?就會(huì)返回相?應(yīng)的字段值?而我們并不?知道它是如?何處理的也?基本無(wú)法控?制。而PL/SQL語(yǔ)言?,則具備程序?設(shè)計(jì)語(yǔ)言甚?至高級(jí)程序?設(shè)計(jì)語(yǔ)言的?特點(diǎn),更好地滿足?我們對(duì)數(shù)據(jù)?的操作。 PL/SQL有什?么優(yōu)勢(shì)? PL/SQL的優(yōu)?勢(shì)可以概括?為以
5、下五點(diǎn)?(待補(bǔ)充): 1 具備程序設(shè)?計(jì)語(yǔ)言的特?性(模塊化、信息隱藏、面向?qū)ο蟮?); 2 異常處理,PL/SQL具備?異常處理的?機(jī)制; 3 可移植,想想Jav?a吧,看看兩者有?什么共同之?處?PL/SQL的J?VM就是O?racle? Serve?r,呵呵 4 改善性能,一方面,通過(guò)PL/SQL語(yǔ)句?塊(Block?)可以一次性?向Orac?le Serve?r發(fā)送多個(gè)?SQL語(yǔ)句?,減少網(wǎng)絡(luò)的?傳輸;另一方面,有些PL/SQL可以?在客戶端執(zhí)?行(前提是某些?客戶端含有?PL/SQL引擎?),可以有效的?減少與Or?acle Serve?r的交互;再有,PL/SQL通常?會(huì)存
6、儲(chǔ)在O?racle?數(shù)據(jù)庫(kù)中,這對(duì)于網(wǎng)絡(luò)?程序來(lái)說(shuō)真?是天降福音?,因?yàn)?,這樣一系列?的處理交互?,都可以以一?個(gè)調(diào)用數(shù)據(jù)?庫(kù)本身存在?的程序而完?成,大大提高了?性能。 5 可以與SQ?L交互,在PL/SQL中可?以嵌入SQ?L的DML?、DQL、TCL(事務(wù)控制語(yǔ)?言)語(yǔ)句。 第二章 SQL回顧? 你都開(kāi)始對(duì)?PL/SQL感性?趣了,那么SQL?肯定是多多?少少聽(tīng)說(shuō)過(guò)?的,呵呵,就回顧一些?基礎(chǔ)吧,那些拓展的?內(nèi)容,建議是遇見(jiàn)?了再研究吧?。 DQL: 源碼dql?.sql: selec?t dname?, max(sal) -- 5 對(duì)列篩選(分組字段或?聚集函數(shù)) fro
7、m emp left outer? join dept -- 1 確定表 using?(deptn?o) where? deptn?o > 0 -- 2 確定行(記錄) group? by dname? -- 3 將行分組 havin?g max(comm) is null or max(comm) > 0 -- 4 對(duì)組篩選 order? by dname? -- 6 對(duì)結(jié)果集排?序 如上的源碼?表示了SQ?L語(yǔ)句的執(zhí)?行順序,這個(gè)一定要?理解好啊! 思考題: 問(wèn)題:為什么帶有?group? by的se?lect和?havin?g只能含有?分組字段和?聚集函數(shù)呢?? 答
8、:因?yàn)間ro?up by分組后?,只能對(duì)組進(jìn)?行操作了。也就是說(shuō),無(wú)論你是篩?選行hav?ing還是?列sele?ct,都要以組為?單位進(jìn)行,所以只能使?用組共有的?屬性,除了分組字?段外,只有像什么?每組的最大?值啊、最小值啊、平均值啊等?等這些組的?特性或叫 組員共有的?特性。 所以在使用?時(shí)一定注意?,帶有g(shù)ro?up by后,havin?g和sel?ect中只?能有-分組字段和?聚集函數(shù) DML: inser?t into value?s就不再重?復(fù)了,不過(guò)聽(tīng)說(shuō)現(xiàn)?在可以一次?性向多個(gè)表?中插入呢,使用ins?ert into all和i?nsert? into first?,具
9、體用法如?下: inser?t into all/first? when 條件 then into 表1 when 條件 then into 表2 when 條件 then into 表3 else into 表4 selec?t from 表源 至于ALL?和FIRS?T的區(qū)別就?是:如果是AL?L,就會(huì)插入所?有滿足條件?的表,而如果是F?IRST直?插入第一個(gè)?滿足條件的?表。 TCL: commi?t; rollb?ack to A; savep?oint A; 不多寫了,因?yàn)槲乙仓?知道這點(diǎn)兒?了,呵呵,不過(guò)聽(tīng)說(shuō)S?QL有個(gè)優(yōu)?化hint?挺好玩,如:ins
10、er?t /+appen?d+/ into table? value?s XXX;還有對(duì)Gr?oup by的拓展?rollu?p和cub?e,還有g(shù)ro?uping?函數(shù)、group? set等,以后再研究?把,誰(shuí)讓俺是菜?鳥呢? 第三章PL?/SQL的基?本結(jié)構(gòu) 本章將從P?L/SQL的分?類、PL/SQL的基?本結(jié)構(gòu)以及?第一個(gè)PL?/SQL程序?展開(kāi)。 PL/SQL的分?類: 按照PL/SQL的運(yùn)?行環(huán)境,可以分為客?戶端PL/SQL和服?務(wù)器端PL?/SQL。通常,我們(指開(kāi)發(fā)者)接觸到的P?L/SQL都是?存儲(chǔ)在服務(wù)?器Orac?le數(shù)據(jù)庫(kù)?中的,所以主要學(xué)?習(xí)這一種就?可以
11、了,至于客戶端?的PL/SQL,我也不太了?解啊…,o(︶︿︶)o 唉希望大蝦?在與我聯(lián)系?,加上??! 按照形式,可分為命名?的PL/SQL和匿?名的PL/SQL,其中,命名的,又可以分為?子程序和觸?發(fā)器,而子程序又?可以分為包?、函數(shù)、過(guò)程。是不是有點(diǎn)?兒?不過(guò)不要緊?,等你看過(guò)整?個(gè)文章,再回來(lái)看就?是很簡(jiǎn)單了?。 PL/SQL的基?本結(jié)構(gòu)如下?: Decla?re 在這里可以?定義變量、常量、異常等。 Begin? 在這兒可以?寫一些執(zhí)行?SQL或P?L/SQL語(yǔ)句?。 Excep?tion 這兒可以捕?獲并處理異?常 怎樣在發(fā)生?異常后讓程?序繼續(xù)執(zhí)行?其
12、他語(yǔ)句呢?? 答:寫在這塊兒?不就得了,呵呵 End;結(jié)束了,別忘了“;”啊,呵呵 你的第一個(gè)?程序?也是我的,“hello?, world?!” 有人說(shuō)he?llo world?太老套了,borin?g,有什么,在你什么都?不懂時(shí)還能?開(kāi)發(fā)出更高?級(jí)的么,我們就he?llo world?呵呵。 源碼: 說(shuō)明:源碼都是由?PL/SQL Devel?oper 8開(kāi)發(fā),于Orac?le10g?測(cè)試 -- Creat?ed on 2010-4-27 by Quasa?r /* 這就是 你的第一個(gè)?程序了,也是我的,哈哈 */ decla?re msg var
13、ch?ar2(15); --定義變量 begin? msg := 'Hello? World?'; --賦值 dbms_?outpu?t.put_l?ine(msg); --內(nèi)置包使用? end; 運(yùn)行結(jié)果: Hello? World? PL/SQL的注?釋可以通過(guò)?這個(gè)程序看?出來(lái)啊,自己看吧,不多說(shuō)了… 第四章PL?/SQL的數(shù)?據(jù)類型及使?用 本章將介紹?PL/SQL的數(shù)?據(jù)類型,有些數(shù)據(jù)類?型很“簡(jiǎn)單”,有些很難理?解,不過(guò)都是因?為這些數(shù)據(jù)?類型你沒(méi)有?使用過(guò),用幾次就知?道了,
14、在這里,先認(rèn)識(shí)認(rèn)識(shí)?它們,不熟也沒(méi)關(guān)?系。 PL/SQL的變?量類型可以?分為標(biāo)量、復(fù)合類型、參照類型和?LOB類型?四類,下面就分別?介紹給大家?。 標(biāo)量,就是單值變?量,這么說(shuō)應(yīng)該?可以理解吧?。常用的類型?如下: 字符串:varch?ar2(n)、char(n)、long、long raw 在程序設(shè)計(jì)?中,常常用到字?符串的處理?,在PL/SQL中,有很好的支?持,不但有字符?串函數(shù),還有對(duì)正則?表達(dá)式的支?持。我們最常用?的數(shù)據(jù)類型?就是var?char2?(n)了,n用于最大?字符長(zhǎng)度。其中,char和?long、long raw不推?薦使用,原因是:前者浪費(fèi)資?源后者不夠?
15、靈活。 數(shù)字:numbe?r(m, n)、binar?y_int?eger、binar?y_flo?at、binar?y_dou?ble 對(duì)于數(shù)字類?型,numbe?r是不錯(cuò)的?選擇,那么m, n代表什么?呢?如果定義為?numbe?r(6, 2)則代表整數(shù)?位最大長(zhǎng)度?是4,小數(shù)位最大?長(zhǎng)度是2,你猜猜吧,m和n的含?義。 其中,binar?y_int?eger在?定義表時(shí)是?很常用的。 binar?y_flo?at和bi?nary_?doubl?e是Ora?cle 10g的新?數(shù)據(jù)類型,注意在賦值?時(shí)格式分別?如下:223.4323f?和2342?3.4545d?,像Java?吧,
16、可能都遵循?IEEE-754的浮?點(diǎn)數(shù)標(biāo)準(zhǔn)吧?。 布爾:Boole?an 布爾值分別?為:TRUE、FALSE?、NULL 日期:Date和?Times?tamp Date默?認(rèn)只顯示日?期,而Time?stamp?默認(rèn)情況下?會(huì)顯示時(shí)間?信息,還有上下午?標(biāo)志呢,Times?tamp是?Oracl?e 9i新加入?的數(shù)據(jù)類型?。 標(biāo)量的定義?格式: vname? DATAT?YPE [CONST?ANT][NOT NULL] [:= / DEFAU?LT exp] 例如: name varch?ar2(30); REAL_?NAME varch?
17、ar2(30) const?ant defau?lt ‘魏照哲’; name varch?ar2(10) := ‘hello?’; 下面是一個(gè)?標(biāo)量使用的?例子程序: 源碼:scala?r.tst 例子程序來(lái)?自scot?t/scott?用戶或hr?/hr用戶(alter? user scott? accou?nt unloc?k解鎖) -- Creat?ed on 2010-4-27 by Quasa?r decla?re eno numbe?r(4); empna?me varch?ar2(3); empjo?b varch?ar2(9); b
18、egin? selec?t empno?, ename?, job into eno, empna?me, empjo?b from emp where? empno? = 7788; dbms_?outpu?t.put_l?ine('Oracl?e第一個(gè)員?工的信息:'); dbms_?outpu?t.put_l?ine('員工號(hào):'||eno); dbms_?outpu?t.put_l?ine('員工姓名:'||empna?me); dbms_?outpu?t.put_l?ine('職位:'||empjo?b); end; 運(yùn)行結(jié)果: 如上就是說(shuō)?v
19、arch?ar2不夠?長(zhǎng)啊,呵呵,交給你個(gè)定?義標(biāo)量sc?alar的?法寶:%TYPE,通過(guò)它你就?可以使用字?段的數(shù)據(jù)類?型了,避免類型不?匹配等錯(cuò)誤?。更改程序e?mpnam?e的定義如?下: empna?me emp.ename?%TYPE; 運(yùn)行結(jié)果: Oracl?e第一個(gè)員?工的信息: 員工號(hào):7788 員工姓名:SCOTT? 職位:ANALY?ST 接下來(lái)就是?復(fù)合變量,即多值變量?,包括:記錄、索引表、嵌套表、變長(zhǎng)數(shù)組。其中,后三者有可?叫做集合(colle?ction?)。分別針對(duì)不?同的數(shù)據(jù)結(jié)?構(gòu)使用,如記錄是單?行多列時(shí)使?用,其他三個(gè)是?多行單列,行和列
20、就代?表數(shù)據(jù)庫(kù)表?的行和列,慢慢體會(huì)啊?… 記錄: 記錄,用于存儲(chǔ)單?行多列,即數(shù)據(jù)庫(kù)表?中的一條記?錄。 記錄的定義?有兩中格式?,一種是自定?義記錄類型?,然后通過(guò)自?定義類型定?義;一種是通過(guò)?表或游標(biāo)的?%ROWTY?PE屬性定?義,還記得字段?的%TYPE么?,差不多。游標(biāo)在后文?中介紹。 自定義: TYPE rname?_type? IS RECOR?D ( col1 CTYPE?, col2 CTYPE?, col3 CTYPE? ); ranme? rname?_type?; 光說(shuō)不練犯?暈啊,呵呵,下面就看一?些記錄的應(yīng)?用吧。 源碼rec?or
21、d.tst: -- Creat?ed on 2010-4-27 by Quasa?r decla?re --通過(guò)自定義?和%ROWTY?PE屬性定?義變量 type emp_b?asic_?recor?d is recor?d ( eno emp.empno?%type, empna?me emp.ename?%type, empjo?b emp.job%type ); emp_b?asic_?info emp_b?asic_?recor?d; emp_d?etail?_info? emp%rowty
22、?pe; begin? selec?t empno?, ename?, job into emp_b?asic_?info from emp where? empno? = 7788; dbms_?outpu?t.put_l?ine('員工778?8基本信息?:'); dbms_?outpu?t.put_l?ine('姓名:'||emp_b?asic_?info.empna?me); dbms_?outpu?t.put_l?ine('工作:'||emp_b?asic_?info.empjo?b); --來(lái)了一個(gè)新?的scot?t員工 sel
23、ec?t ename?, job, mgr, sal into emp_d?etail?_info?.ename?, emp_d?etail?_info?.job, emp_d?etail?_info?.mgr, emp_d?etail?_info?.sal from emp where? empno? = 7788; emp_d?etail?_info?.empno? := 8899; emp_d?etail?_info?.hired?ate := sysda?te; --入職吧 inser?t into emp value?s
24、emp_d?etail?_info?; commi?t; dbms_?outpu?t.new_l?ine; dbms_?outpu?t.put_l?ine('入職員工:'||emp_d?etail?_info?.empno?); --老的sco?tt受不了?小的sco?tt,讓他改名為? lit scott? emp_d?etail?_info?.ename? := 'lit scott?'; updat?e emp set row = emp_d?etail?_info? where? emp.empno? = 8899; commi?t;
25、 dbms_?outpu?t.new_l?ine; dbms_?outpu?t.put_l?ine('入職員工改?名為:'||emp_d?etail?_info?.ename?); --小scot?t被fir?e了 delet?e from emp where? emp.empno? = emp_d?etail?_info?.empno?; commi?t; dbms_?outpu?t.new_l?ine; dbms_?outpu?t.put_l?ine('員工離職,是誰(shuí)?'||emp_d?etail?_info?.ename?); e
26、nd; 運(yùn)行結(jié)果: 員工778?8基本信息?: 姓名:SCOTT? 工作:ANALY?ST 入職員工:8899 入職員工改?名為:lit scott? 員工離職,是誰(shuí)?lit scott? 以上的代碼?說(shuō)明了記錄?類型的變量?在sele?ct into、inser?t、updat?e、delet?e中的應(yīng)用?,極其記錄子?元素的使用?。其中有個(gè)新?的關(guān)鍵自,就是row?代表表中的?一行,猜也猜到了?吧! 集合: PL/SQL表(傳統(tǒng)叫做索?引表,又叫ind?ex_by? table?),是一種PL?/SQL特有?的、單維的、無(wú)容量限制?的、松散存儲(chǔ)
27、的?列表結(jié)構(gòu)。用于存儲(chǔ)多?行單列的數(shù)?據(jù),有點(diǎn)兒類似?高級(jí)語(yǔ)言中?的數(shù)組,而記錄跟C?語(yǔ)言中的結(jié)?構(gòu)體類似。不可以作為?表的字段類?型。 注意: 在Orac?le9i以?后,叫做PL/SQL表了?,因?yàn)樗饕?類型不再局?限在bin?ary_i?ntege?r了,可以是va?rchar?2和pls?_inte?ger。也叫做關(guān)聯(lián)?表(assoc?iativ?e table?). 下面就看看?怎么使用吧?! 源碼pls?qltab?le.tst: -- Creat?ed on 2010-4-27 by Quasa?r decla?re type names?_type? i
28、s table? of emp.ename?%type index? by binar?y_int?eger; names? names?_type?; type ano_n?ames_?type is table? of emp.ename?%type index? by varch?ar2(10); ano_n?ames ano_n?ames_?type; begin? names?(2) := 'Elain?e'; names?(-18) := 'Sopra?no'; ano_n?ames('girl') := 'Elain?e';
29、 ano_n?ames('man') := 'Sopra?no'; dbms_?outpu?t.put_l?ine(ano_n?ames('girl')); dbms_?outpu?t.put_l?ine(names?(-18)); end; 運(yùn)行結(jié)果: Elain?e Sopra?no 以上是PL?SQL TABLE?的使用,其索引不僅?僅可以是b?inary?_inte?ger哦! 嵌套表(neste?d table?),它與pls?ql表不同?,定義需要c?reate?語(yǔ)句,也正因?yàn)榇?,可以作為數(shù)?據(jù)庫(kù)表的字?段。它也是單維?的、容量
30、無(wú)限的?,初始情況下?是密集存儲(chǔ)?的,但是經(jīng)過(guò)刪?除則變?yōu)橄?疏的了。索引是1到?很大的整數(shù)??。? 定義格式之?類的啊,說(shuō)一些理論?還不如讓你?看源碼,呵呵,但還是補(bǔ)充?一句,定義分為兩?種: SQL定義?和編程定義?,格式如下: creat?e or repla?ce type XXX is table? of XXX; type XXX is table? of XXX; 首先,定義類型c?reate?neste?dtabl?e.sql: 源碼nes?tedta?ble.tst: -- Creat?ed on 2010-4-27 by Quasa?r decla?r
31、e inser?t_tab?le neste?d_nam?es_ty?pe := neste?d_nam?es_ty?pe('Jack', 'Quasa?r', 'Patri?ck', 'Shu'); get_n?ested?_name?s neste?d_nam?es_ty?pe; type ano_n?ested?_name?s_typ?e is table? of varch?ar2(30); prog_?neste?d_nam?es ano_n?ested?_name?s_typ?e := ano_n?ested?_name?s_typ?e(); b
32、egin? inser?t into test_?neste?d_tab?le value?s(1234, inser?t_tab?le); commi?t; selec?t tnt.neste?d_nam?es into get_n?ested?_name?s from test_?neste?d_tab?le tnt where? id = '1234'; for i in get_n?ested?_name?s.first?..get_n?ested?_name?s.last loop dbms_?outpu?t.put_l?in
33、e(get_n?ested?_name?s(i)); end loop; prog_?neste?d_nam?es.exten?d(2); prog_?neste?d_nam?es(1) := 'Quasa?r'; prog_?neste?d_nam?es(2) := 'Elain?e'; end; 運(yùn)行結(jié)果: Jack Quasa?r Patri?ck Shu 以上的程序?說(shuō)明了嵌套?表的使用特?點(diǎn),類型定義可?以在SQL?語(yǔ)句中,也可以在P?LSQL程?序中,而且前者可?以作為表的?字段類型,注意的是必?須使用ne?sted table
34、? XXX store? as XXX,后面學(xué)的v?array?就不用指定?存儲(chǔ)表,因?yàn)樗谴?儲(chǔ)在所在表?中。使用前要使?用構(gòu)造函數(shù)?初始化,向Java?一樣,然后,在使用時(shí),一般使用內(nèi)?置exte?nd拓展并?初始化單個(gè)?元素。 變長(zhǎng)數(shù)組v?array?和嵌套表很?像啊,區(qū)別就是v?array?容量有限是?緊湊儲(chǔ)存的?而且使用它?作為字段時(shí)?不需要指定?存儲(chǔ)表。不多說(shuō)了,直接看源碼?吧。 首先,定義必須的?前提cre?ateva?rray.sql: 源碼var?ray.tst: -- Creat?ed on 2010-4-27 by Quasa?r decla?re
35、 type prog_?vr_na?mes_t?ype is varra?y(10) of varch?ar2(20); prog_?vr_na?mes prog_?vr_na?mes_t?ype := prog_?vr_na?mes_t?ype(); put_v?r_nam?es varra?y_typ?e := varra?y_typ?e('Jacky?', 'Chris?tfa'); get_v?r_nam?es varra?y_typ?e; begin? prog_?vr_na?mes.exten?d(3); prog_?v
36、r_na?mes(1) := 'Elain?e'; prog_?vr_na?mes(3) := 'Jobh'; inser?t into test_?varra?y value?s(1234, put_v?r_nam?es); commi?t; selec?t tv.vr_na?mes into get_v?r_nam?es from test_?varra?y tv where? tv.id = 1234; dbms_?outpu?t.put_l?ine('共取出記錄?:'||get_v?r_nam?es.count?||'條!'); end
37、; 運(yùn)行結(jié)果: 那還用問(wèn),必須的,兩條?。? 以上學(xué)習(xí)了?復(fù)合類型的?使用,后面還要學(xué)?習(xí)集合類型?的函數(shù)使用?,不過(guò),我猜我現(xiàn)在?對(duì)集合類型?的了解有點(diǎn)?混亂,先給大家列?個(gè)表吧,然后再繼續(xù)?學(xué)習(xí)集合類?型。 特性 索引表 嵌套表 變長(zhǎng)數(shù)組 存儲(chǔ)類型 稀疏 初始稀疏 一直稀疏 容量限制 無(wú)限 無(wú)限 有限 可以用于表?字段類型 不可以 可以,但必須指定?存儲(chǔ)表 可以 初始化前 空集合 NULL NULL 元素初始化? 默認(rèn)為空 構(gòu)造函數(shù)+exten?d 構(gòu)造函數(shù)+exten?d 索引類型 數(shù)字、字符串 1- 很大 1 –
38、很大 差不多得了?,主要是會(huì)用?,呵呵,下面就學(xué)學(xué)?集合函數(shù)吧?!集合提供給?大家如下函?數(shù),見(jiàn)下表: 函數(shù) 作用 用法 索引表 嵌套表 變長(zhǎng)數(shù)組 EXTEN?D 增加一個(gè)空?元素 exten?d(n) N Y Y DELET?E 刪除元素 delet?e全部 delet?e(n) delet?e(m,n) N Y Y TRIM 從尾部刪除? trim一?個(gè) trim(n) N Y Y 還有就是一?些其他的函?數(shù)了,包括:EXIST?S, COUNT?, LIMIT?(只適用于V?ARRAY?),FIRST?和LAST?下標(biāo), PR
39、IOR?和NEXT?下標(biāo)。 集合的操作?不只是這些?,不過(guò)我是一?時(shí)接受不了?太多….還包括集合?賦值、集合比較啊?,使用時(shí)再細(xì)?細(xì)體會(huì)吧!希望大蝦賜?教?。? 在這一部分?當(dāng)中,批量綁定很?重要啊,能夠大大提?高在處理集?合時(shí)的效率?,感覺(jué)也比較?常用,主要是fo?rall和?bulk colle?ct兩種語(yǔ)?法,下面就學(xué)學(xué)?批量綁定(bulk bindi?ng)吧! FORAL?L: 使用格式: FORAL?L index? IN start?..end FORAL?L index? IN INDIC?ES OF colle?ction? FORAL?L index?
40、 IN VALUE?S OF index?s_col?lecti?on BULK COLLE?CT: 使用格式: …...BULK COLLE?CT INTO colle?ction? 源碼bul?kbind?ing.tst: -- Creat?ed on 2010-4-28 by Quasa?r decla?re type dname?_tabl?e_typ?e is table? of dept_?bck.dname?%type; v_dna?me_ta?ble dname?_tabl?e_typ?e; v_ret?urn_t?able dname?_
41、tabl?e_typ?e; v_dna?me dept_?bck.dname?%type; type index?_tabl?e_typ?e is table? of binar?y_int?eger; v_ind?ex_ta?ble index?_tabl?e_typ?e := index?_tabl?e_typ?e(2,4); begin? --bulk colle?ct selec?t dname? bulk colle?ct into v_dna?me_ta?ble from dept_?bck; --foral?l in
42、.. foral?l i in v_dna?me_ta?ble.first?..v_dna?me_ta?ble.last updat?e dept_?bck set dname? = v_dna?me_ta?ble(i) retur?ning dname? bulk colle?ct into v_ret?urn_t?able; --DML retur?ning dbms_?outpu?t.put_l?ine('DML影響?的行數(shù)bu?lkbin?ding:'||v_ret?urn_t?able.COUNT?); commi?t; -
43、-plain? inser?t inser?t into dept_?bck value?s(90, 'YYYY', 'XXXX') retur?ning dname? into v_dna?me; dbms_?outpu?t.put_l?ine('插入:'||v_dna?me||sql%rowco?unt); --impli?cit curso?r or SQL curso?r --foral?l in indic?es of .. v_dna?me_ta?ble(2) := null; foral?l i in indic?es of v_dna?me_
44、ta?ble updat?e dept_?bck set dname? = v_dna?me_ta?ble(i); dbms_?outpu?t.put_l?ine('第2個(gè)元素?影響的行數(shù)?為:'||sql%bulk_?rowco?unt(2)); commi?t; --foral?l in value?s of .. foral?l i in value?s of v_ind?ex_ta?ble updat?e dept_?bck set dname? = v_dna?me_ta?ble(i); commi?t; end;
45、 以上代碼介?紹了bul?k bindi?ng中fo?rall和?bulk colle?ct的使用?,其中,foral?l針對(duì)集合?的不連續(xù)性?,又有for?all in indic?es of 和 foral?l in value?s of 變體,挺好的?。」? 除了批量綁?定fora?ll和bu?lk colle?ct之外,你發(fā)現(xiàn)什么?了?對(duì)了,sql%bulk_?rowco?unt是專?門為批量綁?定而設(shè)的游?標(biāo)屬性,就是決定了?在批量操作?中,某個(gè)元素所?影響的行數(shù)?。還有ret?urnin?g之句,可以獲得D?ML的影響?結(jié)果記錄。游標(biāo),很常用的,這里隱隱約?約提到了隱
46、?式游標(biāo),后文會(huì)開(kāi)一?章詳細(xì)討論?游標(biāo)CUR?SOR! 參照變量: 參照變量是?存放數(shù)值指?針的變量,可以通過(guò)參?照變量,共享相同的?對(duì)象,降低占用空?間。參照變量包?括游標(biāo)變量?(ref curso?r)和對(duì)象類型?便來(lái)那個(gè)(ref objec?t_typ?e)兩種,其中,兩者都將在?后文中介紹?,不過(guò),還是先認(rèn)識(shí)?以下游標(biāo)變?量吧,感性的認(rèn)識(shí)?哦! 源碼ref?curso?r.tst: -- Creat?ed on 2010-4-29 by Quasa?r decla?re type emp_r?ef_cu?r_typ?e is ref curso?r;
47、v_emp?_ref_?cur emp_r?ef_cu?r_typ?e; --v_emp? emp%rowty?pe; type emp_t?able_?type is table? of emp%rowty?pe; emp_t?able emp_t?able_?type; begin? open v_emp?_ref_?cur for selec?t * from emp; fetch? v_emp?_ref_?cur bulk colle?ct into emp_t?able; -- bulk colle?ct
48、close? v_emp?_ref_?cur; dbms_?outpu?t.put_l?ine('員工信息表?單如下:'); for i in emp_t?able.first?..emp_t?able.last loop dbms_?outpu?t.put_l?ine('工號(hào):'||emp_t?able(i).empno?); dbms_?outpu?t.put_l?ine('姓名:'||emp_t?able(i).ename?); dbms_?outpu?t.put_l?ine('工作:'||emp_t?able(i).job); dbm
49、s_?outpu?t.put_l?ine('工資:'||emp_t?able(i).sal); dbms_?outpu?t.put_l?ine('補(bǔ)助:'||nvl(emp_t?able(i).comm, 0)); dbms_?outpu?t.new_l?ine; end loop; end; 以上講了標(biāo)?量、復(fù)合變量(記錄和集合?)、參照變量(游標(biāo)變量和?對(duì)象類型便?變量),還差一個(gè)就?是大對(duì)象L?OB了,在這里就介?紹以下,后面另開(kāi)辟?一章單獨(dú)講?解對(duì)它的處?理。 LOB: 大對(duì)象在O?racle?中有兩種:內(nèi)部LOB?,外部LOB?;內(nèi)部LOB?包括CL
50、O?B、NCLOB?、BLOB;外部LOB?只包含BF?ILE。 內(nèi)部LOB?存儲(chǔ)在數(shù)據(jù)?庫(kù)中,數(shù)據(jù)的操作?支持事務(wù)。外部的LO?B存儲(chǔ)在O?S操作系統(tǒng)?中,如BFIL?E,數(shù)據(jù)庫(kù)存放?的是在OS?中的文件指?針。 CLOB/NCLOB?用于存儲(chǔ)字?符文件,BLOB用?于存儲(chǔ)二進(jìn)?制文件。BFILE?用于存儲(chǔ)二?進(jìn)制文件,如:電影。 學(xué)習(xí)了這章?,你有點(diǎn)兒迷?糊,是啊,文章結(jié)構(gòu)弄?錯(cuò)了,應(yīng)該先學(xué)下?一章,流程控制,哈哈哈 第五章 流程控制 在上一章節(jié)?的例子中,你可能認(rèn)識(shí)?了循環(huán),還有些什么?流程控制呢??那還用說(shuō),無(wú)非那主要?的三種:順序、選擇、循環(huán),還有那臭名?昭著的go?to,
51、沒(méi)什么可說(shuō)?的,就直接代碼?展示吧,呵呵,其實(shí)是不會(huì)?寫… 選擇結(jié)構(gòu): 語(yǔ)法: if XXX then elsif? XXX then elsif? XXX then else XXX end if; case when XXX then when XXX then else XXX end case; 循環(huán)結(jié)構(gòu) 語(yǔ)法: loop exit when end loop; while? loop end loop; for XXX in .. loop end loop; 順序結(jié)構(gòu): <
52、el?; 源碼con?trol.tst: -- Creat?ed on 2010-4-29 by Quasa?r decla?re dept_?recor?d dept%rowty?pe; emp_r?ecord? emp%rowty?pe; curso?r dept_?cur is selec?t * from dept; type emp_t?able_?type is table? of emp_r?ecord?%type; emp_t?able emp_t?able_?type; begin? if d
53、ept_?cur%isope?n then --if null; else open dept_?cur; dbms_?outpu?t.put_l?ine('open...'); end if; /* open后?才可以使用?屬性 found? notfo?und rowco?unt的默?認(rèn)值 */ dbms_?outpu?t.put_l?ine('curso?r%isope?n的初始值?:'||Boole?anToC?har(dept_?cur%isop
54、e?n)); dbms_?outpu?t.put_l?ine('curso?r%found?的初始值:'||Boole?anToC?har(dept_?cur%found?)); dbms_?outpu?t.put_l?ine('curso?r%notfo?und的初?始值:'||Boole?anToC?har(dept_?cur%notfo?und)); dbms_?outpu?t.put_l?ine('curso?r%count?的初始值:'||dept_?cur%rowco?unt); while? TRUE loop
55、 -- while? fetch? dept_?cur into dept_?recor?d; if dept_?cur%found? then dbms_?outpu?t.put_l?ine(dept_?recor?d.dname?||' locat?ing in '||dept_?recor?d.loc); else dbms_?outpu?t.put_l?ine('no data end!'); exit; end if; end loop; /*
56、 取值后 */ dbms_?outpu?t.put_l?ine('curso?r%isope?n的初始值?:'||Boole?anToC?har(dept_?cur%isope?n)); dbms_?outpu?t.put_l?ine('curso?r%found?的初始值:'||Boole?anToC?har(dept_?cur%found?)); dbms_?outpu?t.put_l?ine('curso?r%notfo?und的初?始值:'||Boole?anToC?har(dept_?cur%notfo?und)); dbms_?outpu?t.put_
57、l?ine('curso?r%count?的初始值:'||dept_?cur%rowco?unt); if dept_?cur%isope?n then close? dept_?cur; end if; /* selec?t * bulk colle?ct into emp_t?able from emp; dbms_?outpu?t.new_l?ine; for i in emp_t?able.first?..emp_t?able.last loop -- for case emp_t?ab
58、le(i).empno? when 7788 then dbms_?outpu?t.put_l?ine('This is the first? emplo?yee:SCOTT?!'); else dbms_?outpu?t.put_l?ine('This is '||emp_t?able(i).ename?); end case; -- case end loop;*/ end; 除了認(rèn)識(shí)這?
59、些控制流程?語(yǔ)句,還附加地通?過(guò)這個(gè)了解?了游標(biāo)的屬?性,下一章就是?處理多行數(shù)?據(jù)時(shí)最常用?的、最好用的、最簡(jiǎn)便的游?標(biāo)了,哈哈哈,拭目以待吧?!呵呵呵 第六章 游標(biāo) 游標(biāo),curso?r是ora?cle9i?之前處理多?行數(shù)據(jù)的唯?一選擇,不過(guò)現(xiàn)在你?可以使用前?面介紹的s?elect? XX bulk colle?ct into from了?。雖然如此,游標(biāo)的靈活?與簡(jiǎn)便性還?是不可代替?的。 游標(biāo)可以分?為隱式游標(biāo)?和顯示游標(biāo)?。隱式游標(biāo)具?備游標(biāo)的特?性,是在Ora?cle執(zhí)行?SQL語(yǔ)句?時(shí)提供給用?戶的游標(biāo),命名為SQ?L,可以通過(guò)S?QL%XXX訪問(wèn)?游標(biāo)的四個(gè)?屬性:I
60、SOPE?N/FOUND?/NOTFO?UND/ROWCO?UNT(注意這個(gè)屬?性,可能跟你理?解的不同啊?),這幾個(gè)屬性?的含義分別?是:除了iso?pen外, 在通過(guò)fe?tch之后?,是否找到數(shù)?據(jù)和已經(jīng)取?得幾條的意?思,在第五章的?contr?ol.tst中有?關(guān)這方面的?測(cè)試,回去看吧! 再就是顯示?游標(biāo)了,顯示游標(biāo)可?以分為:0 普通顯示游?標(biāo)1 參數(shù)游標(biāo)、2 游標(biāo)變量(參照變量的?一種)、3 用于DML?的游標(biāo)(簡(jiǎn)稱DML?游標(biāo))、4 游標(biāo)表達(dá)式?(又叫嵌套游?標(biāo)),就這些了,下面就一個(gè)?一個(gè)認(rèn)識(shí)吧?。在后面還會(huì)?涉及到特殊?的針對(duì)游標(biāo)?的“游標(biāo)for?循環(huán)”。 顯示游標(biāo)
61、 在這個(gè)顯示?游標(biāo)中,我們將學(xué)習(xí)?使用游標(biāo)的?聲明、打開(kāi)、處理、關(guān)閉固定的?操作和處理?時(shí)獲得游標(biāo)?數(shù)據(jù)的三種?FETCH?語(yǔ)句: FETCH? XXX INTO XXX, XXX; (取得一條) FETCH? XXX BULK COLLE?CT INTO XXX; (取得全部) FETCH? XXX BULK COLLE?CT INTO XXX LIMIT? XXX; (取得n條) 除了按照正?常的套路處?理游標(biāo),還可以使用?最簡(jiǎn)便的游?標(biāo)FOR循?環(huán)處理游標(biāo)?,游標(biāo)FOR?循環(huán)會(huì)默認(rèn)?地打開(kāi)、處理、關(guān)閉游標(biāo),很好吧,哈哈哈 源碼pla?incur?sor.tst
62、: -- Creat?ed on 2010-4-29 by Quasa?r decla?re curso?r dept_?curso?r is --decla?re selec?t * from dept; d_rec?ord dept_?curso?r%rowty?pe; type d_tab?le_ty?pe is table? of d_rec?ord%type; d_tab?le d_tab?le_ty?pe; type d_var?ray_t?ype is varra?y(2) of d_rec?ord%type
63、; d_var?ray d_var?ray_t?ype; begin? --游標(biāo)for?循環(huán)1 for dept_?recor?d in dept_?curso?r loop dbms_?outpu?t.put_l?ine('DEPT:'||dept_?recor?d.dname?); end loop; dbms_?outpu?t.new_l?ine; --最簡(jiǎn)單的游?標(biāo)for循?環(huán)2 for dept_?recor?d in (selec?t * from dept) loop dbms_?outp
64、u?t.put_l?ine('DEPT:'||dept_?recor?d.dname?); end loop; --fetch? into dbms_?outpu?t.new_l?ine; open dept_?curso?r; -- open loop fetch? dept_?curso?r into d_rec?ord; --fetch? exit when dept_?curso?r%notfo?und; dbms_?outpu?t.put_l?ine('DEP
65、T:'||d_rec?ord.dname?); end loop; close? dept_?curso?r; --close? --fetch? bulk colle?ct into (witho?ut limit?) dbms_?outpu?t.new_l?ine; open dept_?curso?r; fetch? dept_?curso?r bulk colle?ct into d_tab?le; close? dept_?curso?r; for i in d_tab?le.first?
66、..d_tab?le.last loop dbms_?outpu?t.put_l?ine('DEPT:'||d_tab?le(i).dname?); end loop; --fetch? bulk colle?ct into limit? dbms_?outpu?t.new_l?ine; open dept_?curso?r; loop fetch? dept_?curso?r bulk colle?ct into d_var?ray limit? 2; exit when dept_?curso?r%notfo?und; dbms_?outpu?t.put_l?ine('-----------------------'); for i in 1..2 loop dbms_?outpu?t.put_l?ine('DEPT:'||d_var?ray(i).dname?); end loop; end loop; close? d
- 溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 離心泵的檢修各零部件檢修標(biāo)準(zhǔn)
- 金屬材料疲勞強(qiáng)度的八大主要影響因素
- 機(jī)械安全知識(shí)
- 電機(jī)的工作原理與種類
- 設(shè)備點(diǎn)檢內(nèi)容
- 有效防止液壓系統(tǒng)漏油的技術(shù)要領(lǐng)
- 鈑金和管工機(jī)械安全操作規(guī)程
- 閥門的100個(gè)專業(yè)術(shù)語(yǔ)
- 某單位機(jī)械設(shè)備安全檢查表
- 離心泵的汽蝕與吸入特性
- 過(guò)濾網(wǎng)目數(shù)標(biāo)準(zhǔn)
- 減少設(shè)備潤(rùn)滑故障的措施
- 離心泵機(jī)械密封安裝使用規(guī)則
- 閥門常見(jiàn)故障與原因
- 呼吸閥和真空破壞閥基礎(chǔ)知識(shí)總結(jié)
相關(guān)資源
更多