(Oracle学习笔记) PL/SQL编程语言
文章目錄
- 一、PL/SQL塊結(jié)構(gòu)
- 二、注釋
- 三、數(shù)據(jù)類型
- Number(p,s)
- %TYPE
- Record
- %ROWTYPE
- 四、選擇語(yǔ)句
- If......then
- If....then.....else
- If....then....elsif......then....else
- Case語(yǔ)句
- 五、循環(huán)語(yǔ)句
- Loop
- While
- For
- 六、游標(biāo)
- 顯式游標(biāo):
- 隱式游標(biāo)
- 遍歷隱式游標(biāo)
- 遍歷顯式游標(biāo)
- 七、存儲(chǔ)過(guò)程
- 存儲(chǔ)過(guò)程創(chuàng)建
- 存儲(chǔ)過(guò)程參數(shù)
- IN
- Out
- IN OUT
- 刪除存儲(chǔ)過(guò)程
- 八、異常處理
- 使用oracle預(yù)處理異常
- 自定義異常:錯(cuò)誤編號(hào)異常
- Raise主動(dòng)拋出異常
- 九、觸發(fā)器
- 語(yǔ)句級(jí)觸發(fā)器
- 行級(jí)別觸發(fā)器
- 用戶事件觸發(fā)器
- 刪除觸發(fā)器
- 十、視圖
- 創(chuàng)建簡(jiǎn)單視圖
- 復(fù)雜視圖
- 連接視圖
- 刪除視圖
一、PL/SQL塊結(jié)構(gòu)
(1)聲明部分(DECLARE)開(kāi)始(可選),到BEGIN關(guān)鍵字結(jié)束,這一部分可以聲明PL/SQL程序塊中所用到的變量、常量和游標(biāo)等。
注:再某個(gè)PL/SQL塊中聲明的內(nèi)容,只能在當(dāng)前塊中使用
(2)執(zhí)行部分(BEGIN)開(kāi)始(必須有),結(jié)束方式有兩種。如果語(yǔ)句塊中運(yùn)行出現(xiàn)異常,則執(zhí)行異常處理部分的代碼結(jié)束。如果代碼塊沒(méi)有異常,則以執(zhí)行到END關(guān)鍵字結(jié)束。
(3)異常處理部分(EXCEPTION),語(yǔ)句塊出現(xiàn)異常時(shí)執(zhí)行該部分,執(zhí)行結(jié)束后,整個(gè)PL/SQL語(yǔ)句塊執(zhí)行結(jié)束。
注:每一條語(yǔ)句都必須以分號(hào)結(jié)束,每條SQL語(yǔ)句可以寫(xiě)成多行,以分號(hào)結(jié)束;
二、注釋
單行注釋 –
多行注釋 /。。。。。/
三、數(shù)據(jù)類型
Number(p,s)
p標(biāo)識(shí)精度(所有有效數(shù)字) s標(biāo)識(shí)刻度范圍(小數(shù)點(diǎn)右邊的位數(shù))
Char長(zhǎng)度固定,最大2000字節(jié)
Varchar2長(zhǎng)度不固定,最大4000字節(jié)
Long長(zhǎng)度不固定,最大32767字節(jié)
%TYPE
優(yōu)點(diǎn)
(1)用戶不必查看表結(jié)構(gòu)中各列的數(shù)據(jù)類型就可以定義保存某列值的變量
(2)如果對(duì)表中列的類型進(jìn)行修改,無(wú)需考慮更改pl/sql語(yǔ)句塊中定義的變量類型
Select…into 對(duì)變量進(jìn)行賦值
Record
存儲(chǔ)由多列組成的一行數(shù)據(jù),是一種結(jié)構(gòu)化的數(shù)據(jù)類型,使用type語(yǔ)句進(jìn)行定義
%ROWTYPE
結(jié)合了%TYPE和RECORD變量的優(yōu)點(diǎn),可以根據(jù)數(shù)據(jù)表中行的結(jié)構(gòu),定義一種特殊的數(shù)據(jù)類型,用來(lái)存儲(chǔ)從數(shù)據(jù)表中檢索到的一行數(shù)據(jù)
declare --定義能夠存儲(chǔ)emp表中一行數(shù)據(jù)的變量row_emp emp%rowtype;begin--檢索數(shù)據(jù)存儲(chǔ)到定義的變量select * into row_empfrom empwhere empno = 7369;--輸出查詢的數(shù)據(jù)dbms_output.put_line('雇員'||row_emp.ename||'的編號(hào)'||row_emp.empno||'職務(wù)是'||row_emp.job);end;四、選擇語(yǔ)句
If…then
只做一種情況條件判斷
declarevar_name1 varchar2(50);var_name2 varchar2(50);beginvar_name1 := 'AAA';var_name2 := 'BB';if length(var_name1) > length(var_name2) thendbms_output.put_line('字符串'||var_name1||'的長(zhǎng)度比字符串'||var_name2||'的長(zhǎng)度大');end if;end;If…then…else
可以實(shí)現(xiàn)判斷兩種情況分支
declareage int := 20;begin if age >= 18 then dbms_output.put_line('你已經(jīng)老了');else dbms_output.put_line('你還年輕');end if;end;If…then…elsif…then…else
實(shí)現(xiàn)多分支選擇語(yǔ)句
declare--定義月份變量month int; begin--獲取系統(tǒng)當(dāng)前時(shí)間月份,賦值給month變量select to_char(sysdate,'MM')into monthfrom dual;--判斷是第幾季度if month >= 1 and month <=3 thendbms_output.put_line('這是第一季度');elsif month >=4 and month <=6 thendbms_output.put_line('這是第二季度');elsif month >=7 and month <=9 thendbms_output.put_line('這是第三季度');elsif month >=10 and month <=12 thendbms_output.put_line('這是第一季度');elsedbms_output.put_line('月份不符合要求');end if; end;Case語(yǔ)句
與elseif類似,case后面通常是一個(gè)變量
declareseason int :=3;info varchar2(50); begincase seasonwhen 1 then info := '季度包含1,2,3月份';when 2 then info := '季度包含4,5,6月份';when 3 then info := '季度包含7,8,9月份';when 4 then info := '季度包含10,11,12月份';else info := '季度不合法';end case;dbms_output.put_line(info); end;五、循環(huán)語(yǔ)句
Loop
Loop語(yǔ)句會(huì)先執(zhí)行一次循環(huán)體,然后判斷‘EXIT WHEN’關(guān)鍵字后面的條件表達(dá)式,若為true則退出循環(huán)體,否則繼續(xù)執(zhí)行循環(huán)體,所以loop至少執(zhí)行一次循環(huán)體
declare--定義整數(shù)變量,存儲(chǔ)整數(shù)和sum_i int := 0;--定義整數(shù)變量,存儲(chǔ)自然數(shù)i int := 0; begin--循環(huán)累加loop--給自然數(shù)賦值i := i+1;--計(jì)算前n個(gè)自然數(shù)的和sum_i := sum_i+i;--當(dāng)循環(huán)100次時(shí),程序退出循環(huán)體exit when i = 100;end loop;dbms_output.put_line('前100個(gè)自然數(shù)之和為:'||sum_i); end;While
執(zhí)行0次或多次循環(huán)體,在每次執(zhí)行循環(huán)體之前,首先判斷條件表達(dá)式的值是否為true,若為true在執(zhí)行循環(huán)體語(yǔ)句,否則退出循環(huán)體
declaresum_i int := 0;i int :=0;beginwhile i <= 100 loopi := i+1;sum_i := sum_i + i;end loop;dbms_output.put_line(sum_i);end;For
For語(yǔ)句是一個(gè)可以預(yù)置循環(huán)次數(shù)的循環(huán)控制語(yǔ)句,它有一個(gè)循環(huán)計(jì)數(shù)器,通常是一個(gè)整型變量,通過(guò)這個(gè)循環(huán)計(jì)數(shù)器來(lái)控制循環(huán)次數(shù)
declaresum_i int := 0;beginfor i in reverse 1..100 loop--判斷是否為偶數(shù)if mod(i,2) = 0 thensum_i := sum_i + i;end if;end loop;dbms_output.put_line('和為'||sum_i);end;六、游標(biāo)
顯式游標(biāo):
聲明游標(biāo)
主要包括游標(biāo)名和為游標(biāo)提供結(jié)果集的select語(yǔ)句,因此聲明游標(biāo)時(shí)必須指定游標(biāo)名和游標(biāo)所使用的select語(yǔ)句
打開(kāi)游標(biāo)
游標(biāo)聲明完之后,必須打開(kāi)才能使用
Open 游標(biāo)名稱[()],當(dāng)省略參數(shù)后,傳入的就為默認(rèn)值
讀取游標(biāo)
讀取游標(biāo)就是逐行將結(jié)果集中的數(shù)據(jù)保存到變量中處理。
Fetch cur_name into(variable)
Variable:一個(gè)變量列表或‘記錄’變量(record類型)
%found:布爾值,存在值為true,否則為false
關(guān)閉游標(biāo)
Close cur_name;
實(shí)例:
隱式游標(biāo)
將emp表中銷售員的工資上調(diào)20%,然后使用隱式游標(biāo)sql的%rowcount屬性輸出上調(diào)員工的數(shù)量
%rowcount受sql語(yǔ)句影響的行數(shù)
遍歷隱式游標(biāo)
遍歷顯式游標(biāo)
七、存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程創(chuàng)建
存儲(chǔ)過(guò)程參數(shù)
IN
Out
IN OUT
刪除存儲(chǔ)過(guò)程
drop procedure pro_square;
八、異常處理
使用oracle預(yù)處理異常
自定義異常:錯(cuò)誤編號(hào)異常
自定義異常:業(yè)務(wù)邏輯異常
Raise主動(dòng)拋出異常
九、觸發(fā)器
語(yǔ)句級(jí)觸發(fā)器
行級(jí)別觸發(fā)器
用戶事件觸發(fā)器
刪除觸發(fā)器
drop trigger tri_ddl_oper;
十、視圖
創(chuàng)建簡(jiǎn)單視圖
復(fù)雜視圖
復(fù)雜視圖指包括函數(shù)、表達(dá)式或分組數(shù)據(jù)的視圖
連接視圖
連接視圖指基于多個(gè)表所建立的視圖。使用連接視圖主要目的是為了簡(jiǎn)化連接查詢。需要注意,連表查詢時(shí),必須使用where子句指定有效的連接條件,否則結(jié)果就是毫無(wú)意義的笛卡爾積
刪除視圖
drop view emp_view_uni;
總結(jié)
以上是生活随笔為你收集整理的(Oracle学习笔记) PL/SQL编程语言的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle 错误: ORA-1289
- 下一篇: (JAVA学习笔记) static关键字