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