PL/SQL知識總結(1):PL/SQL塊結構和流程控制語句
阿新 • • 發佈:2019-01-09
前一段時間系統學習了Oracle PL/SQL的有關知識,內容有點多,所以覺得自己要總結一下,順便回顧,大家共同學習。
PL/SQL的概念
PL/SQL是 Procedure Language & Structured Query Language 的縮寫。字面意思是過程化語言(PL)和結構化查詢語言(SQL),它擴充套件了SQL語言,是一種過程處理語言。
PL/SQL塊結構
PL/SQL程式的塊分為三部分:
- 宣告部分
- 可執行部分
- 異常處理部分
example1:
DECLARE --宣告部分
v_num number(10) := 0;
BEGIN --BEGIN 至 END 為可執行部分
v_num :=2/v_num;
DBMS_OUTPUT.PUT_LINE(v_num);
EXCEPTION --異常處理部分
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('出錯!');
END;
Output: 出錯!
增例1
--修改一條資料並顯示
declare
row_id rowid;
info varchar2(40);
begin
update dept set loc = '長沙' where deptno = 50
returning rowid,dname||':'||to_char(deptno)||':'||loc
into row_id,info;
dbms_output.put_line('rowid:'||row_id);
dbms_output.put_line(info);
end;
其中:returning子句用於檢索修改行的資訊。
增例2
關於陣列的用法
varray資料型別的陣列來說,必須經過三個步驟,分別是:定義、宣告、初始化。
--陣列
declare
--定義array_type為 陣列最大長度為5且陣列中的元素型別為varchar(20) 的type
type array_type is varray(5) of varchar(20);
--宣告array_type型別的v_arr陣列
v_arr array_type;
begin
--初始化v_arr
v_arr := array_type('杭州','寧波','溫州','紹興','湖州');
dbms_output.put_line('城市名稱:'||v_arr(1) ||'、'
||v_arr(2) ||'、'||v_arr(3) ||'、'||v_arr(4));
dbms_output.put_line('第5個值:'||v_arr(5)); --output:第5個值:湖州
v_arr(5) := '嘉興';
dbms_output.put_line('第5個值:'||v_arr(5));-- output:第5個值:嘉興 //已被修改
--v_arr(6) := '金華'; 越界
end;
使用%TYPE %ROWTYPE
屬性型別:
- %TYEP:引用變數和資料庫列的資料型別,針對特定的屬性。
- %ROWTYPE:提供表中一行記錄的型別。
example2(%TYPE):
DECLARE
v_empno NUMBER(10);
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
v_empno := &empno;--提示使用者輸入一個empno的值
SELECT ename, sal INTO v_ename, v_sal FROM emp WHERE empno = v_empno;
DBMS_OUTPUT.PUT_LINE( '員工' ||v_ename|| '的工資為:'||v_sal );
END;
Input: 7788
Output: 員工SCOTT的工資為:3000
example3(%ROWTYPE):
DECLARE
v_emp emp%ROWTYPE;
BEGIN
SELECT * INTO v_emp FROM emp WHERE empno = &empno;
DBMS_OUTPUT.PUT_LINE('員工' ||v_ename|| '的工資為:'||v_sal);
END;
Input: 7654
Output: 員工MARTIN的工資為:2000
PL/SQL的流程控制語句
- 控制語句:IF 語句 CASE語句
- 迴圈語句: FOR語句 LOOP語句 WHILE語句
- 順序語句:GOTO語句 EXIT語句
IF的語句大致語法:
IF...THEN
...
ELSIF...THEN
...
ELSE
...
END IF;
example4(if語句的使用):
/*給定員工的編號根據員工的薪水如果大於2000則輸出high,1000到2000為middle,其他為low*/
DECLARE
v_sal emp.sal%TYPE;
v_empno emp.empno%TYPE;
BEGIN
v_empno := &empno;
SELECT sal INTO v_sal FROM emp WHERE empno = v_empno;
IF v_sal <=1000 THEN
DBMS_OUTPUT.PUT_LINE('low');
ELSIF v_sal <=2000 THEN
DBMS_OUTPUT.PUT_LINE('middle');
ELSE
DBMS_OUTPUT.PUT_LINE('high');
END IF;
END;
Input: 7654
Output: middle
CASE:
CASE...
WHEN...THEN...
...
END;
example5(CASE語句的使用):
BEGIN
CASE '&grade'
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('優秀');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('良好');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('中等');
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('及格');
WHEN 'E' THEN DBMS_OUTPUT.PUT_LINE('不及格');
ELSE DBMS_OUTPUT.PUT_LINE('沒有此等級');
END CASE;
END;
FOR的語法:
FOR 迴圈計數器 IN 下限..上限 LOOP
要執行的語句;
END LOOP;
LOOP語句的語法:
LOOP
...
EXIT WHEN(...)
END LOOP;
example6(FOR語句 LOOP巢狀):
/*九九乘法表*/
DECLARE
j INT :=0;
BEGIN
LOOP
j := j + 1 ;
FOR i IN j..9 LOOP
DBMS_OUTPUT.PUT(j||'*'||i||'='||i*j||' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE('');
EXIT WHEN(j>=9);
END LOOP;
END;
Output:略。
WHILE語句語法:
WHILE ... LOOP
...
END LOOP;
GOTO語句語法:
GOTO label;
......
<<label>> /*標號是用<< >>括起來的識別符號 */
example6(WHILE語句 GOTO語句巢狀):
DECLARE
v_num NUMBER := 1;
BEGIN
WHILE v_num <= 5 LOOP
DBMS_OUTPUT.PUT_LINE('v_num的當前值為:'||v_num );
v_num := v_num + 1;
IF v_num > 5 THEN
GOTO label;
END IF;
END LOOP;
<<label>>
DBMS_OUTPUT.PUT_LINE('v_num的當前值為:'||v_num );
END;
Output:
v_num的當前值為:1
v_num的當前值為:2
v_num的當前值為:3
v_num的當前值為:4
v_num的當前值為:5
v_num的當前值為:6