1. 程式人生 > >PL/SQL知識總結(1):PL/SQL塊結構和流程控制語句

PL/SQL知識總結(1):PL/SQL塊結構和流程控制語句

前一段時間系統學習了Oracle PL/SQL的有關知識,內容有點多,所以覺得自己要總結一下,順便回顧,大家共同學習。

PL/SQL的概念

PL/SQL是 Procedure Language & Structured Query Language 的縮寫。字面意思是過程化語言(PL)和結構化查詢語言(SQL),它擴充套件了SQL語言,是一種過程處理語言。

PL/SQL塊結構

PL/SQL程式的塊分為三部分:

  1. 宣告部分
  2. 可執行部分
  3. 異常處理部分

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

屬性型別:

  1. %TYEP:引用變數和資料庫列的資料型別,針對特定的屬性。
  2. %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的流程控制語句

  1. 控制語句:IF 語句 CASE語句
  2. 迴圈語句: FOR語句 LOOP語句 WHILE語句
  3. 順序語句: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