<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    kxbin
    成功留給有準備的人
    posts - 10,  comments - 35,  trackbacks - 0

    本篇主要內容如下:

    3.1  條件語句

    3.2  CASE 表達式

    3.3  循環

    3.4  標號和GOTO

    3.5  NULL 語句


     

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

    控制語句: IF 語句

    循環語句: LOOP語句, EXIT語句

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

     

    3.1  條件語句

     

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

     

     

    提示: ELSIF 不能寫成 ELSEIF

    例1:

     

    復制代碼
    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:
    = '太少了,加點吧~!';
       ELSIF v_salary 
    <3000 THEN
          V_comment:
    = '多了點,少點吧~!';
       
    ELSE
          V_comment:
    = '沒有薪水~!';
       
    END IF;
       DBMS_OUTPUT.PUT_LINE(V_comment);
       exception
         
    when no_data_found then
            DBMS_OUTPUT.PUT_LINE(
    '沒有數據~!');
         
    when others then
            DBMS_OUTPUT.PUT_LINE(sqlcode 
    || '---' || sqlerrm);        
    END;
    復制代碼

     

     

    2:

     

    復制代碼
    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;
    復制代碼

     

     

    3:

    復制代碼
    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;
    復制代碼

     

    3.2  CASE 表達式

     

    復制代碼
    ---------格式一---------
    CASE 條件表達式
      
    WHEN 條件表達式結果1 THEN 
         語句段1
      
    WHEN 條件表達式結果2 THEN
         語句段2
      ......
      
    WHEN 條件表達式結果n THEN
         語句段n
      
    [ELSE 條件表達式結果]
    END;
    ---------格式二---------
    CASE 
      
    WHEN 條件表達式1 THEN
         語句段1
      
    WHEN 條件表達式2 THEN
         語句段2
      ......
      
    WHEN 條件表達式n THEN 
         語句段n
      
    [ELSE 語句段]
    END;
    復制代碼

     

     

    4:

     

    復制代碼
    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;
    復制代碼

     

     

    5:

     

    復制代碼
    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;
    復制代碼

     

     

     

    3.3  循環

     1.  簡單循環

     

      LOOP
          要執行的語句;
          
    EXIT WHEN <條件語句> --條件滿足,退出循環語句
      END LOOP;

     

     

    例 6.

     

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

     

     

    2.  WHILE 循環

    WHILE <布爾表達式> LOOP
        要執行的語句;
    END LOOP;

     

     

    7.

     

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

     

     

    3.  數字式循環

     

    [<<循環標簽>>]
    FOR 循環計數器 IN [ REVERSE ] 下限 .. 上限 LOOP
      要執行的語句;
    END LOOP [循環標簽];

     

     

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

    8.

     

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

     

     

    例 9.

     

    復制代碼
    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;
    復制代碼

     

     

    10:

     

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

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

       
    --用FOR...LOOP...END LOOP循環使用每個數組成員的值
       FOR i IN v_jobids.FIRST..v_jobids.LAST LOOP

       
    --針對數組中的每個崗位,決定該崗位的雇員的數量
          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;
    復制代碼

     

     

    11 在While循環中嵌套loop循環

    復制代碼
    /*求100至110之間的素數*/
    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 || '個素數是' || v_m);
          
    END IF;

          v_m :
    = v_m + 2;
       
    END LOOP;
    END;
    復制代碼

     

    4  標號和GOTO 

    PL/SQL中GOTO語句是無條件跳轉到指定的標號去的意思。語法如下:

     

    GOTO label;
    ......
    <<label>> /*標號是用<< >>括起來的標識符 */

     

     

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

    跳轉到非執行語句前面。

    跳轉到子塊中。

    跳轉到循環語句中。

    跳轉到條件語句中。

    從異常處理部分跳轉到執行。

    從條件語句的一部分跳轉到另一部分。

    12:

     

    復制代碼
    DECLARE
       V_counter 
    NUMBER := 1;
    BEGIN
       LOOP 
         DBMS_OUTPUT.PUT_LINE(
    'V_counter的當前值為:'||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的當前值為:'||V_counter);
    END;
    復制代碼

     

     

    例13:

    復制代碼
    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;
    復制代碼

     

    3.5  NULL 語句 

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

    例14:

     

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

     

    例15:

     

    復制代碼
    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 閱讀(366) 評論(0)  編輯  收藏 所屬分類: ORACLE轉發
    你恨一個人是因為你愛他;你喜歡一個人,是因為他身上有你沒有的;你討厭一個人是因為他身上有你有的東西;你經常在別人面前批評某人,其實潛意識中是想接近他。

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(5)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    收藏夾

    J2EE

    java技術網站

    Linux

    平時常去的網站

    數據庫

    電影網站

    網站設計

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产精品成人久久| 十八禁视频在线观看免费无码无遮挡骂过| 中文字幕精品亚洲无线码二区 | 久久亚洲精品成人777大小说| 最近最新中文字幕完整版免费高清 | 亚洲AV无码成人网站在线观看| 亚洲电影中文字幕| 亚洲另类少妇17p| 曰韩无码AV片免费播放不卡| 亚洲人成网国产最新在线| 亚洲天天在线日亚洲洲精| 亚洲综合精品网站| 又黄又爽一线毛片免费观看| 全免费毛片在线播放| 无码人妻精品中文字幕免费 | 四虎影视久久久免费观看| 亚洲私人无码综合久久网| 亚洲一级片免费看| 国产免费啪嗒啪嗒视频看看| 美女视频黄免费亚洲| 曰批全过程免费视频网址| 久久久久免费精品国产小说| a级毛片在线免费| 精品乱子伦一区二区三区高清免费播放| 亚洲色偷精品一区二区三区| 色婷五月综激情亚洲综合| 亚洲欧洲日本精品| 亚洲色成人网一二三区| 亚洲色图黄色小说| 久久久亚洲欧洲日产国码二区| 亚洲av永久无码精品漫画| 亚洲国产精品无码久久久不卡| 在线播放亚洲第一字幕| 精品亚洲一区二区三区在线播放| 免费女人高潮流视频在线观看| 亚洲va中文字幕| 亚洲高清毛片一区二区| 亚洲av无码专区在线观看亚| 亚洲欧洲无码AV不卡在线| 亚洲国产精品久久久久网站 | 亚洲av无码专区在线观看下载|