kxbin
          成功留給有準(zhǔn)備的人
          posts - 10,  comments - 35,  trackbacks - 0

          本篇主要內(nèi)容如下:

          3.1  條件語句

          3.2  CASE 表達(dá)式

          3.3  循環(huán)

          3.4  標(biāo)號和GOTO

          3.5  NULL 語句


           

          介紹PL/SQL的流程控制語句, 包括如下三類:

          控制語句: IF 語句

          循環(huán)語句: LOOP語句, EXIT語句

          順序語句: GOTO語句, NULL語句

           

          3.1  條件語句

           

          復(fù)制代碼
          IF <布爾表達(dá)式> THEN
            PL
          /SQL 和 SQL語句
          END IF;
          -----------------------
          IF <布爾表達(dá)式> THEN
            PL
          /SQL 和 SQL語句
          ELSE
            其它語句
          END IF;
          -----------------------
          IF <布爾表達(dá)式> THEN
            PL
          /SQL 和 SQL語句
          ELSIF 
          < 其它布爾表達(dá)式> THEN
            其它語句
          ELSIF 
          < 其它布爾表達(dá)式> THEN
            其它語句
          ELSE
            其它語句
          END IF;
          復(fù)制代碼

           

           

          提示: ELSIF 不能寫成 ELSEIF

          例1:

           

          復(fù)制代碼
          DECLARE
              v_empno  employees.employee_id
          %TYPE :=&empno;
              V_salary employees.salary
          %TYPE;
              V_comment 
          VARCHAR2(35);
          BEGIN
             
          SELECT salary INTO v_salary FROM employees 
             
          WHERE employee_id = v_empno;
             
          IF v_salary < 1500 THEN
                 V_comment:
          = '太少了,加點(diǎn)吧~!';
             ELSIF v_salary 
          <3000 THEN
                V_comment:
          = '多了點(diǎn),少點(diǎn)吧~!';
             
          ELSE
                V_comment:
          = '沒有薪水~!';
             
          END IF;
             DBMS_OUTPUT.PUT_LINE(V_comment);
             exception
               
          when no_data_found then
                  DBMS_OUTPUT.PUT_LINE(
          '沒有數(shù)據(jù)~!');
               
          when others then
                  DBMS_OUTPUT.PUT_LINE(sqlcode 
          || '---' || sqlerrm);        
          END;
          復(fù)制代碼

           

           

          2:

           

          復(fù)制代碼
          DECLARE
             v_first_name  
          VARCHAR2(20);
             v_salary 
          NUMBER(7,2);
          BEGIN
             
          SELECT first_name, salary INTO v_first_name, v_salary FROM employees
             
          WHERE employee_id = &emp_id;
             DBMS_OUTPUT.PUT_LINE(v_first_name
          ||'雇員的工資是'||v_salary);
             
          IF v_salary < 10000 THEN
                DBMS_OUTPUT.PUT_LINE(
          '工資低于10000');
             
          ELSE
                
          IF 10000 <= v_salary AND v_salary < 20000 THEN
                   DBMS_OUTPUT.PUT_LINE(
          '工資在10000到20000之間');
                
          ELSE
                   DBMS_OUTPUT.PUT_LINE(
          '工資高于20000');
                
          END IF;
             
          END IF;
          END;
          復(fù)制代碼

           

           

          3:

          復(fù)制代碼
          DECLARE
             v_first_name  
          VARCHAR2(20);
             v_hire_date DATE;
             v_bonus 
          NUMBER(6,2);
          BEGIN
             
          SELECT first_name, hire_date INTO v_first_name, v_hire_date FROM employees
             
          WHERE employee_id = &emp_id;
             
          IF v_hire_date > TO_DATE('01-1月-90'THEN
                v_bonus :
          = 800;
             ELSIF v_hire_date 
          > TO_DATE('01-1月-88'THEN
                v_bonus :
          = 1600;
             
          ELSE
                v_bonus :
          = 2400;
             
          END IF;
             DBMS_OUTPUT.PUT_LINE(v_first_name
          ||'雇員的雇傭日期是'||v_hire_date
                                              
          ||'、獎金是'||v_bonus);
          END;
          復(fù)制代碼

           

          3.2  CASE 表達(dá)式

           

          復(fù)制代碼
          ---------格式一---------
          CASE 條件表達(dá)式
            
          WHEN 條件表達(dá)式結(jié)果1 THEN 
               語句段1
            
          WHEN 條件表達(dá)式結(jié)果2 THEN
               語句段2
            ......
            
          WHEN 條件表達(dá)式結(jié)果n THEN
               語句段n
            
          [ELSE 條件表達(dá)式結(jié)果]
          END;
          ---------格式二---------
          CASE 
            
          WHEN 條件表達(dá)式1 THEN
               語句段1
            
          WHEN 條件表達(dá)式2 THEN
               語句段2
            ......
            
          WHEN 條件表達(dá)式n THEN 
               語句段n
            
          [ELSE 語句段]
          END;
          復(fù)制代碼

           

           

          4:

           

          復(fù)制代碼
          DECLARE
            V_grade 
          char(1) := UPPER('&p_grade');
            V_appraisal 
          VARCHAR2(20);
          BEGIN
            V_appraisal :
          =
            
          CASE v_grade
              
          WHEN 'A' THEN 'Excellent'
              
          WHEN 'B' THEN 'Very Good'
              
          WHEN 'C' THEN 'Good'
              
          ELSE 'No such grade'
            
          END;
            DBMS_OUTPUT.PUT_LINE(
          'Grade:'||v_grade||'  Appraisal: '|| v_appraisal);
          END;
          復(fù)制代碼

           

           

          5:

           

          復(fù)制代碼
          DECLARE
             v_first_name employees.first_name
          %TYPE;
             v_job_id employees.job_id
          %TYPE;
             v_salary employees.salary
          %TYPE;
             v_sal_raise 
          NUMBER(3,2);
          BEGIN
             
          SELECT first_name,   job_id,   salary INTO
                    v_first_name, v_job_id, v_salary
             
          FROM employees WHERE employee_id = &emp_id;
             
          CASE
                
          WHEN v_job_id = 'PU_CLERK' THEN
                   
          IF v_salary < 3000 THEN v_sal_raise := .08;
                   
          ELSE v_sal_raise := .07;
                   
          END IF;
                
          WHEN v_job_id = 'SH_CLERK' THEN
                   
          IF v_salary < 4000 THEN v_sal_raise := .06;
                   
          ELSE v_sal_raise := .05;
                   
          END IF;
                
          WHEN v_job_id = 'ST_CLERK' THEN
                   
          IF v_salary < 3500 THEN v_sal_raise := .04;
                   
          ELSE v_sal_raise := .03;
                   
          END IF;
                
          ELSE
                   DBMS_OUTPUT.PUT_LINE(
          '該崗位不漲工資: '||v_job_id);
             
          END CASE;
             DBMS_OUTPUT.PUT_LINE(v_first_name
          ||'的崗位是'||v_job_id
                                              
          ||'、的工資是'||v_salary
                                              
          ||'、工資漲幅是'||v_sal_raise);
          END;
          復(fù)制代碼

           

           

           

          3.3  循環(huán)

           1.  簡單循環(huán)

           

            LOOP
                要執(zhí)行的語句;
                
          EXIT WHEN <條件語句> --條件滿足,退出循環(huán)語句
            END LOOP;

           

           

          例 6.

           

          復(fù)制代碼
          DECLARE
              
          int NUMBER(2) :=0;
          BEGIN
             LOOP
                
          int := int + 1;
                DBMS_OUTPUT.PUT_LINE(
          'int 的當(dāng)前值為:'||int);
                
          EXIT WHEN int =10;
             
          END LOOP;
          END;
          復(fù)制代碼

           

           

          2.  WHILE 循環(huán)

          WHILE <布爾表達(dá)式> LOOP
              要執(zhí)行的語句;
          END LOOP;

           

           

          7.

           

          復(fù)制代碼
          DECLARE 
            x 
          NUMBER :=1;
          BEGIN
             
          WHILE x<=10 LOOP
                DBMS_OUTPUT.PUT_LINE(
          'X的當(dāng)前值為:'||x);
                 x:
          = x+1;
             
          END LOOP;
          END;
          復(fù)制代碼

           

           

          3.  數(shù)字式循環(huán)

           

          [<<循環(huán)標(biāo)簽>>]
          FOR 循環(huán)計數(shù)器 IN [ REVERSE ] 下限 .. 上限 LOOP
            要執(zhí)行的語句;
          END LOOP [循環(huán)標(biāo)簽];

           

           

          每循環(huán)一次,循環(huán)變量自動加1;使用關(guān)鍵字REVERSE,循環(huán)變量自動減1。跟在IN REVERSE 后面的數(shù)字必須是從小到大的順序,而且必須是整數(shù),不能是變量或表達(dá)式。可以使用EXIT 退出循環(huán)。

          8.

           

          BEGIN
             
          FOR int  in 1..10 LOOP
                 DBMS_OUTPUT.PUT_LINE(
          'int 的當(dāng)前值為: '||int);
             
          END LOOP;
          END;

           

           

          例 9.

           

          復(fù)制代碼
          CREATE TABLE temp_table(num_col NUMBER);

          DECLARE
              V_counter 
          NUMBER := 10;
          BEGIN
             
          INSERT INTO temp_table(num_col) VALUES (v_counter );
             
          FOR v_counter IN 20 .. 25 LOOP
                
          INSERT INTO temp_table (num_col ) VALUES ( v_counter );
             
          END LOOP;
             
          INSERT INTO temp_table(num_col) VALUES (v_counter );
             
          FOR v_counter IN REVERSE 20 .. 25 LOOP
                
          INSERT INTO temp_table (num_col ) VALUES ( v_counter );
             
          END LOOP;
          END ;

          DROP TABLE temp_table;
          復(fù)制代碼

           

           

          10:

           

          復(fù)制代碼
          DECLARE
             TYPE jobids_varray 
          IS VARRAY(12OF VARCHAR2(10); --定義一個VARRAY數(shù)據(jù)類型
             v_jobids JOBIDS_VARRAY; --聲明一個具有JOBIDS_VARRAY數(shù)據(jù)類型的變量
             v_howmany NUMBER--聲明一個變量來保存雇員的數(shù)量

          BEGIN
             
          --用某些job_id值初始化數(shù)組
             v_jobids := jobids_varray('FI_ACCOUNT''FI_MGR''ST_CLERK''ST_MAN');

             
          --用FOR...LOOP...END LOOP循環(huán)使用每個數(shù)組成員的值
             FOR i IN v_jobids.FIRST..v_jobids.LAST LOOP

             
          --針對數(shù)組中的每個崗位,決定該崗位的雇員的數(shù)量
                SELECT count(*INTO v_howmany FROM employees WHERE job_id = v_jobids(i);
                DBMS_OUTPUT.PUT_LINE ( 
          '崗位'||v_jobids(i)||
                                 
          '總共有'|| TO_CHAR(v_howmany) || '個雇員');
             
          END LOOP;
          END;
          復(fù)制代碼

           

           

          11 在While循環(huán)中嵌套loop循環(huán)

          復(fù)制代碼
          /*求100至110之間的素數(shù)*/
          DECLARE
             v_m 
          NUMBER := 101;
             v_i 
          NUMBER;
             v_n 
          NUMBER := 0;
          BEGIN
             
          WHILE v_m < 110 LOOP
                v_i :
          = 2;
                LOOP
                   
          IF mod(v_m, v_i) = 0 THEN
                      v_i :
          = 0;
                      
          EXIT;
                   
          END IF;
              
                   v_i :
          = v_i + 1;
                   
          EXIT WHEN v_i > v_m - 1
                
          END LOOP;
                
                
          IF v_i > 0 THEN
                   v_n :
          = v_n + 1;
                   DBMS_OUTPUT.PUT_LINE(
          ''|| v_n || '個素數(shù)是' || v_m);
                
          END IF;

                v_m :
          = v_m + 2;
             
          END LOOP;
          END;
          復(fù)制代碼

           

          4  標(biāo)號和GOTO 

          PL/SQL中GOTO語句是無條件跳轉(zhuǎn)到指定的標(biāo)號去的意思。語法如下:

           

          GOTO label;
          ......
          <<label>> /*標(biāo)號是用<< >>括起來的標(biāo)識符 */

           

           

          注意,在以下地方使用是不合法的,編譯時會出錯誤。

          跳轉(zhuǎn)到非執(zhí)行語句前面。

          跳轉(zhuǎn)到子塊中。

          跳轉(zhuǎn)到循環(huán)語句中。

          跳轉(zhuǎn)到條件語句中。

          從異常處理部分跳轉(zhuǎn)到執(zhí)行。

          從條件語句的一部分跳轉(zhuǎn)到另一部分。

          12:

           

          復(fù)制代碼
          DECLARE
             V_counter 
          NUMBER := 1;
          BEGIN
             LOOP 
               DBMS_OUTPUT.PUT_LINE(
          'V_counter的當(dāng)前值為:'||V_counter);
               V_counter :
          = v_counter + 1;
             
          IF v_counter > 10 THEN
                 
          GOTO labelOffLOOP;
             
          END IF;
             
          END LOOP;
             
          <<labelOffLOOP>>
               DBMS_OUTPUT.PUT_LINE(
          'V_counter的當(dāng)前值為:'||V_counter);
          END;
          復(fù)制代碼

           

           

          例13:

          復(fù)制代碼
          DECLARE
             v_i 
          NUMBER := 0;
             v_s 
          NUMBER := 0;
          BEGIN
             
          <<label_1>>
             v_i :
          = v_i + 1;
             
          IF v_i <= 1000 THEN
                v_s :
          = v_s + v_i;
                
          GOTO label_1;
             
          END IF;
             DBMS_OUTPUT.PUT_LINE(v_s);
          END;
          復(fù)制代碼

           

          3.5  NULL 語句 

          在PL/SQL 程序中,NULL語句是一個可執(zhí)行語句,可以用 null 語句來說明“不用做任何事情”的意思,相當(dāng)于一個占位符或不執(zhí)行任何操作的空語句,可以使某些語句變得有意義,提高程序的可讀性,保證其他語句結(jié)構(gòu)的完整性和正確性。如:

          例14:

           

          復(fù)制代碼
          DECLARE
              ...
          BEGIN
              ...
              
          IF v_num IS NULL THEN
              
          GOTO labelPrint;
              
          END IF;
            …
            
          <<labelPrint>>
            
          NULL--不需要處理任何數(shù)據(jù)。
          END;
          復(fù)制代碼

           

          例15:

           

          復(fù)制代碼
          DECLARE
             v_emp_id employees.employee_id
          %TYPE;
             v_first_name employees.first_name
          %TYPE;
             v_salary employees.salary
          %TYPE;
             v_sal_raise 
          NUMBER(3,2);
          BEGIN
             v_emp_id :
          = &emp_id;
             
          SELECT first_name, salary INTO v_first_name, v_salary
             
          FROM employees WHERE employee_id = v_emp_id;
             
          IF v_salary <= 3000 THEN
                v_sal_raise :
          = .10;
                DBMS_OUTPUT.PUT_LINE(v_first_name
          ||'的工資是'||v_salary
                                                 
          ||'、工資漲幅是'||v_sal_raise);
             
          ELSE
                
          NULL;
             
          END IF;
          END;
          posted on 2012-09-12 17:30 kxbin 閱讀(371) 評論(0)  編輯  收藏 所屬分類: ORACLE轉(zhuǎn)發(fā)
          你恨一個人是因為你愛他;你喜歡一個人,是因為他身上有你沒有的;你討厭一個人是因為他身上有你有的東西;你經(jīng)常在別人面前批評某人,其實(shí)潛意識中是想接近他。

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(5)

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          J2EE

          java技術(shù)網(wǎng)站

          Linux

          平時常去的網(wǎng)站

          數(shù)據(jù)庫

          電影網(wǎng)站

          網(wǎng)站設(shè)計

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 乐至县| 惠来县| 尉犁县| 上饶市| 崇义县| 西峡县| 汉阴县| 甘南县| 漳州市| 尖扎县| 丹东市| 三门峡市| 荔波县| 宁强县| 陵水| 阿勒泰市| 白朗县| 九龙坡区| 宜州市| 江陵县| 赣榆县| 沁水县| 白朗县| 浏阳市| 瓦房店市| 特克斯县| 乌鲁木齐县| 思南县| 永吉县| 岐山县| 土默特左旗| 秀山| 邳州市| 中方县| 兴隆县| 盐城市| 怀化市| 孝昌县| 礼泉县| 江川县| 福泉市|