Oracle中PL/SQL的流程控制語句包括哪些?數據庫
在任何計算機語言(例如C/C++、Java、Pascal、SHELL等)中,都有各類控制語句(條件語句,循環結構,順序控制結構等),在PL/SQL中也存在這樣的控制結構。PL/SQL的流程控制語句包括以下三類:
服務器
(1)條件語句:IF語句微信
(2)循環語句:LOOP語句,EXIT語句網絡
(3)順序語句:GOTO語句,NULL語句app
PL/SQL(Procedure Language & Structured Query Language)是Oracle在標準的SQL語言上的擴展。PL/SQL不只容許嵌入SQL語言,還能夠定義變量和常量,容許使用條件語句和循環語句,容許使用異常進行捕獲程序中的各類錯誤,這樣使得它的功能變得更增強大。ide
若是不使用PL/SQL語言,那麼Oracle一次只能處理一條SQL語句。每條SQL語句都致使客戶向服務器調用,從而在性能上產生很大的開銷,尤爲是在網絡操做中。若是使用PL/SQL,那麼一個塊中的語句做爲一個組,對服務器只有一次調用,能夠減小網絡傳輸。函數
關於程序的形式,能夠有以下分類:學習
(1)無名塊:指的是沒有命名的PL/SQL塊,它能夠是嵌入某一個應用之中的一個PL/SQL塊。spa
(2)存儲過程/函數:指的是命名了的PL/SQL塊,它能夠接收參數,並能夠重複地被調用。.net
(3)包:命名了的PL/SQL塊,由一組相關的過程、函數和標識符組成。
(4)庫觸發器:是一個與具體表相關聯的存儲PL/SQL的程序。每當一個SQL操做影響到該數據庫表時,系統就自動執行相應的數據庫觸發器。每一個表最多能夠有12個觸發器。
一個基本的PL/SQL塊由三部分組成:定義部分、可執行部分以及異常處理部分。
(1)定義部分:包含變量、常量和遊標的聲明。這部分是可選的。
(2)可執行部分:包括對數據進行操做的SQL語句。這部分必須存在。
(3)異常處理部分:對可執行部分中的語句在執行過程當中出錯時所作出的處理。這部分是可選的。
具體語法形式以下所示:
DECLARE
/*定義部分——定義常量、變量、遊標、異常、複雜數據類型*/
BEGIN
/*執行部分——要執行的PL/SQL語句和SQL語句*/
EXCEPTION
/*異常處理部分——處理運行的各類錯誤*/
END;
在使用PL/SQL的時候,須要注意如下幾點內容:
(1)定義部分是從DECLARE開始的,該部分是可選的。
(2)DECLARE裏面定義的局部變量用分號隔開。
(3)執行部分是從BEGIN開始的,該部分是必須的。
(4)異常處理部分是從EXCEPTION開始的,該部分是可選的。
(5)END不可缺乏。
這裏給出一個使用PL/SQL塊的例子:
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 V_ENAME VARCHAR2(5);
3 V_SAL NUMBER(7,2);
4 BEGIN
5 --執行部分
6 SELECT ENAME, SAL INTO V_ENAME, V_SAL FROM SCOTT.EMP WHERE EMPNO = 7788;
7 --在控制檯顯示用戶名
8 DBMS_OUTPUT.PUT_LINE('用戶名是:' || V_ENAME || ' 工資:' || V_SAL);
9 --異常處理
10 EXCEPTION
11 WHEN NO_DATA_FOUND THEN
12 DBMS_OUTPUT.PUT_LINE('您的編號輸入有誤!');
13 END;
14 /
用戶名是:SCOTT 工資:3000
PL/SQL procedure successfully completed.
上例介紹了最基本的使用方法,若要精通開發,則須要多加練習。
PL/SQL中提供了三種條件分支語句,以下所示:
① IF - THEN - END IF;
② IF - THEN – ELSE - END IF;
③ IF - THEN – ELSIF - THEN - END IF;
下面給出一個使用IF語句的例子。
SYS@LHRDB> SET SERVEROUTPUT ON
SYS@LHRDB> DECLARE
2 V_SAL SCOTT.EMP.SAL%TYPE := 7788;--工資爲7788元
3 BEGIN
4
5 IF V_SAL < 1500 THEN
6 DBMS_OUTPUT.PUT_LINE('工資太少了');
7 ELSIF (V_SAL < 3000 AND V_SAL >= 1500) THEN
8 DBMS_OUTPUT.PUT_LINE('工資還能夠');
9 ELSIF V_SAL < 5000 THEN
10 DBMS_OUTPUT.PUT_LINE('工資挺好的');
11 ELSE
12 DBMS_OUTPUT.PUT_LINE('工資挺高的');
13 IF V_SAL < 8000 THEN
14 DBMS_OUTPUT.PUT_LINE('是什麼工做呢?');
15 ELSE
16 DBMS_OUTPUT.PUT_LINE('能夠推薦我去嗎?');
17 END IF;
18 END IF;
19 END;
20 /
工資挺高的
是什麼工做呢?
Oracle中的循環有3種結構:LOOP、WHILE和FOR循環。在這3種結構中,最經常使用的就是FOR了,因此,這種結構必定得掌握。
1、LOOP循環
簡單循環語句的通常形式以下所示:
LOOP
要執行的語句;
EXIT WHEN <條件語句> /*條件知足,退出循環語句*/
END LOOP;
其中,EXIT WHEN子句是必須的,不然,循環將沒法中止,同時,須要注意的是,該循環是PL/SQL中最簡單的循環語句,這種循環語句以LOOP開頭,以END LOOP結尾,這種循環至少會被執行一次。
LOOP循環的示例以下所示:
SYS@lhrdb> SET SERVEROUTPUT ON
SYS@lhrdb> DECLARE
2 V_NUM NUMBER(2) := 0;
3 BEGIN
4 LOOP
5 DBMS_OUTPUT.PUT_LINE(V_NUM);
6 V_NUM := V_NUM + 1;
7 EXIT WHEN V_NUM =5;
8 END LOOP;
9 END;
10 /
0
1
2
3
4
2、WHILE循環
WHILE循環語句的通常形式以下所示:
WHILE <布爾表達式> LOOP
要執行的語句;
END LOOP;
其中,循環語句執行的順序是先判斷<布爾表達式>的真假,若是爲真,那麼循環執行,不然退出循環。在WHILE循環語句中,仍然能夠使用EXIT或EXIT WHEN子句。
WHILE循環的示例以下所示:
SYS@lhrdb> SET SERVEROUTPUT ON
SYS@lhrdb> DECLARE
2 V_SUM NUMBER(3) := 0;
3 V_NUM NUMBER(2) := 1;
4 BEGIN
5 WHILE V_NUM <=5 LOOP
6 DBMS_OUTPUT.PUT_LINE(V_NUM);
7 V_SUM := V_SUM + V_NUM;
8 V_NUM := V_NUM + 1;
9 END LOOP;
10 DBMS_OUTPUT.PUT_LINE('SUM IS: ' || V_SUM);
11
12 END;
13 /
1
2
3
4
5
SUM IS: 15
3、FOR循環
FOR循環語句的通常形式以下所示:
FOR 循環計數器 IN [ REVERSE ] 下限..上限LOOP
要執行的語句;
END LOOP;
其中:
(1)每循環一次,循環變量自動加1;使用關鍵字REVERSE,循環變量自動減1。
(2)跟在IN REVERSE 後面的數字必須是從小到大的順序,但不必定是整數,能夠是可以轉換成整數的變量或表達式。
(3)能夠使用EXIT WHEN子句退出循環。
FOR循環的示例以下所示:
SYS@lhrdb> SET SERVEROUTPUT ON
SYS@lhrdb> DECLARE
2 V_SUM NUMBER(4) := 0 ;
3 BEGIN
4 FOR X IN 1 .. 5 LOOP
5 DBMS_OUTPUT.PUT_LINE(X);
6 V_SUM := V_SUM + X;
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE(V_SUM);
9 END;
10 /
1
2
3
4
5
15
PL/SQL procedure successfully completed.
SYS@lhrdb> DECLARE
2 BEGIN
3 FOR X IN REVERSE (5-6) .. (2*3) LOOP --翻轉打印
4 DBMS_OUTPUT.PUT_LINE(X);
5 END LOOP;
6
7 END;
8 /
6
5
4
3
2
1
0
-1
PL/SQL procedure successfully completed.
FOR循環中還有最經常使用的一種形式是遊標FOR循環,下面給出一個例子:
SYS@lhrdb> DECLARE
2 CURSOR EMP_CUR IS
3 SELECT * FROM SCOTT.EMP
4 WHERE ROWNUM<=3;
5 BEGIN
6 --FOR自己就包含了打開、關閉遊標的過程
7 FOR EMP_RECORD IN EMP_CUR LOOP
8 DBMS_OUTPUT.PUT_LINE('NAME IS:' || EMP_RECORD.ENAME || ' AND SAL IS:' ||
9 EMP_RECORD.SAL);
10 END LOOP;
11 END;
12 /
NAME IS:SMITH AND SAL IS:800
NAME IS:ALLEN AND SAL IS:1600
NAME IS:WARD AND SAL IS:1250
PL/SQL procedure successfully completed.
GOTO語句用於跳轉到特定符號去執行語句。須要注意的是,因爲使用GOTO語句會增長程序的複雜性,並使得應用程序可讀性變差,因此,在作通常應用開發時,不建議使用GOTO語句。
GOTO語句的基本語法以下:GOTO LABLE,其中,LABLE是已經定義好的標號名。GOTO語句的通常形式以下所示:
GOTO LABEL;
... ...
<<LABEL>> /*標號是用<< >>括起來的標識符*/
其中,GOTO語句是無條件跳轉到指定的標號LABEL的意思。如下是GOTO語句的一個例子,在該示例中,判斷DBA_JOBS視圖中是否含有「WHAT='PH_ALERT_LOG_LHR;'」的記錄,如有該條記錄,則讓程序休眠10秒後繼續判斷,若沒有,則退出GOTO語句。
DECLARE
V_COUNT NUMBER;
BEGIN
<<REPEAT_LOOP>>
SELECT COUNT(1)
INTO V_COUNT
FROM DBA_JOBS D
WHERE D.WHAT = 'PH_ALERT_LOG_LHR;';
IF V_COUNT > 0 THEN
SYS.DBMS_LOCK.SLEEP(SECONDS => 10);
GOTO REPEAT_LOOP;
END IF;
END;
/
詳細內容能夠添加麥老師微信或QQ私聊。
● 本文做者:小麥苗,只專一於數據庫的技術,更注重技術的運用
● 做者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列題目來源於做者的學習筆記,部分整理自網絡,如有侵權或不當之處還請諒解
● 版權全部,歡迎分享本文,轉載請保留出處
● QQ:646634621 QQ羣:618766405
● 題目解答如有不當之處,還望各位朋友批評指正,共同進步
長按下圖識別二維碼或微信掃描下圖二維碼來關注小麥苗的微信公衆號:xiaomaimiaolhr,學習最實用的數據庫技術。
本文分享自微信公衆號 - DB寶(lhrdba)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。