-
2—2 引用型變量和記錄型變量查看全部
-
oracle連接
查看全部 -
declare 聲明查看全部
-
PLSQL程序設(shè)計(jì)綜合案例
程序設(shè)計(jì)方法
瀑布模型:
需求分析
設(shè)計(jì):概要設(shè)計(jì),詳細(xì)設(shè)計(jì)
編碼:coding
測(cè)試:testing
上線部署
編寫程序,方法:
1.考慮需要用到什么sql語(yǔ)句
2.考慮會(huì)需要哪些變量,考慮變量的初始值,最終值如何得到
查看全部 -
自定義例外
定義變量,類型是exception
使用raise拋出自定義例外
--------------------------實(shí)例如下-----------------------------------------------------------------------------------------------------------------
declare
--聲明游標(biāo)
cursor cemp(dno number) is select ename from emp where deptno=dno;
--定義變量
pname emp.ename%type;
--定義特殊異常變量
no_emp_found exception;
begin
--打開(kāi)游標(biāo)
--20為部門號(hào),是游標(biāo)傳入的形參對(duì)應(yīng)的實(shí)參
open cemp(50);
--游標(biāo)讀取第一行數(shù)據(jù)
fetch cemp into pname;
--判斷游標(biāo)是否有讀取到數(shù)據(jù)
if cemp%notfound then?
--沒(méi)有,則使用raise關(guān)鍵字將自定義異常拋出
raise no_emp_found;
--如果有數(shù)據(jù),則進(jìn)行循環(huán)讀取并打印出來(lái)
else
loop
--注意此處打印語(yǔ)句,如果移到fetch后,則打印的結(jié)果會(huì)少一個(gè),
--因?yàn)榍懊嬗螛?biāo)已經(jīng)讀取了一條,不在循環(huán)之前打印出來(lái)有直接往下讀取了,所以就導(dǎo)致了少了一條數(shù)據(jù)
?dbms_output.put_line(pname);
?fetch cemp into pname;
?--當(dāng)游標(biāo)讀取完所有數(shù)據(jù)后退出循環(huán)
?exit when cemp%notfound;
?end loop;
?end if;
?--注意:當(dāng)系統(tǒng)拋出異常,游標(biāo)并沒(méi)有被關(guān)閉,oracle自動(dòng)啟動(dòng)pmon(process monitor:進(jìn)程監(jiān)視器),
?--將遺留的垃圾進(jìn)行一個(gè)個(gè)回收清理干凈
close cemp;
--例外
exception
--接收拋出的異常并作出處理
when no_emp_found then dbms_output.put_line('找不到員工');
when others then dbms_output.put_line('其他例外');
end;
/
查看全部 -
算術(shù)或者轉(zhuǎn)換例外:value_error
查看全部 -
系統(tǒng)例外之 zero_divide
查看全部 -
系統(tǒng)例外之 too_many_rows
查看全部 -
系統(tǒng)例外之 no_data_found
查看全部 -
PLSQL中的例外
例外是程序設(shè)計(jì)語(yǔ)言提供的一種功能,用來(lái)增強(qiáng)程序的健壯性和容錯(cuò)性
系統(tǒng)例外
No_data_found (沒(méi)有找到數(shù)據(jù))
Too_many_rows (select...into 語(yǔ)句匹配多個(gè)行)
Zero_Divide (被零除)
Value_error(算術(shù)或轉(zhuǎn)換錯(cuò)誤)
Timeout_on_resource (在等待資源是發(fā)生超時(shí))
查看全部 -
帶參數(shù)的光標(biāo)
cursor ?光標(biāo)名 ?[(參數(shù)名 ?數(shù)據(jù)類型[,參數(shù)名 ?數(shù)據(jù)類型]...)] ?is ?select ?語(yǔ)句;
查看全部 -
?1.光標(biāo)的屬性
? ? ?%found ?%notfound
? ? ?%isopen:判斷光標(biāo)是否打開(kāi) true/false
? ? ?%rowcount:影響的行數(shù)
? ? 2.光標(biāo)數(shù)的限制:默認(rèn)情況下,oracle數(shù)據(jù)庫(kù)只允許在同一個(gè)會(huì)話中,打開(kāi)300個(gè)光標(biāo) ? ?
? ? 修改光標(biāo)數(shù)的限制:
? ? alter ?system ?set open_cursors=400 scope=both;
? ? scope的取值:both,memory,spfile(數(shù)據(jù)庫(kù)需要重啟)
查看全部 -
光標(biāo)(游標(biāo))使用語(yǔ)法:
定義游標(biāo)
為光標(biāo)定義對(duì)應(yīng)的變量
在程序體中打開(kāi)光標(biāo)
循環(huán)體中不斷取出新數(shù)據(jù)
關(guān)閉光標(biāo)
程序執(zhí)行如果沒(méi)報(bào)錯(cuò),也沒(méi)產(chǎn)生效果,原因在于PLSQL程序體有對(duì)sql語(yǔ)句操作(對(duì)數(shù)據(jù)進(jìn)行更改)時(shí),需要在事物中執(zhí)行;而oracle默認(rèn)事物級(jí)別為read committed,意味著如果沒(méi)有加上commit 進(jìn)行提交,將不會(huì)產(chǎn)生效果(這里涉及到事物的原子性,隔離性,完整性和一致性),所以在關(guān)閉光標(biāo)后需要提交事物。
提交事物(涉及數(shù)據(jù)更改時(shí))
如果在寫commit之前執(zhí)行過(guò)PLSQL程序一次了,但是數(shù)據(jù)沒(méi)發(fā)生改變,那么,在加上commit之后,最好在begin 后面加個(gè) ?rollback,將剛才的執(zhí)行過(guò)的回退掉,防止影響到結(jié)果
查看全部 -
光標(biāo)(游標(biāo))
引用變量類型和記錄標(biāo)量類型都不能代表一個(gè)集合,而光標(biāo)可以,它就是一個(gè)結(jié)果集。
查看全部 -
循環(huán)語(yǔ)句
while
Loop
EXIT [when ?條件]; ? ---當(dāng)條件成立的時(shí)候,退出循環(huán)
....... ? ? ---否則進(jìn)入循環(huán)操作要執(zhí)行的語(yǔ)句
End loop;
For
FOR ?i ?IN ?1..3 ? LOOP
語(yǔ)句序列;
END LOOP;
查看全部
舉報(bào)