zoukankan      html  css  js  c++  java
  • PL/SQL流程控制语句

    PL/SQL流程控制语句
    介绍PL/SQL的流程控制语句, 包括如下三类:
    控制语句: IF 语句
    循环语句: LOOP语句, EXIT语句
    顺序语句: GOTO语句, NULL语句
    ①if语句
     

    IF <布尔表达式> THEN
    PL/SQL 和SQL语句;
    ELSIF< 其它布尔表达式> THEN
    其它语句;
    ELSIF< 其它布尔表达式> THEN
    其它语句;
    ELSE
    其它语句;
    END IF;

    例:
     

    declare
    v_emp_name employees.last_name%type;
    v_emp_sal employees.salary%type;
    v_emp_sal_level varchar2(20);
    begin
    select last_name,salary into v_emp_name,v_emp_sal from employees where employee_id = 150;
    
    if(v_emp_sal >= 10000) then v_emp_sal_level := 'salary >= 10000';
    elsif(v_emp_sal >= 5000) then v_emp_sal_level := '5000<= salary < 10000';
    else v_emp_sal_level := 'salary < 5000';
    end if;
    
    dbms_output.put_line(v_emp_name||','||v_emp_sal||','||v_emp_sal_level);
    end;

    ② CASE 表达式
     

    CASE selector
    WHEN expression1 THEN result1
    WHEN expression2 THEN result2
    WHEN expressionN THEN resultN
    [ ELSE resultN+1]
    END;

    例:
     

    declare
    v_sal employees.salary%type;
    v_msg varchar2(50);
    begin
    select salary into v_sal
    from employees
    where employee_id = 150;
    
    --case 不能向下面这样用
    /*
    case v_sal when salary >= 10000 then v_msg := '>=10000'
    when salary >= 5000 then v_msg := '5000<= salary < 10000'
    else v_msg := 'salary < 5000'
    end;
    */
    
    v_msg :=
    case trunc(v_sal / 5000)
    when 0 then 'salary < 5000'
    when 1 then '5000<= salary < 10000'
    else 'salary >= 10000'
    end;
    
    dbms_output.put_line(v_sal ||','||v_msg);
    end;

    ③循环
    1. 简单循环
    LOOP
    要执行的语句;
     

    EXIT WHEN<条件语句> ; /*条件满足,退出循环语句*/
    END LOOP;

    2. WHILE 循环(相较1,推荐使用2)

    WHILE<布尔表达式> LOOP
    要执行的语句;
    END LOOP;


    3.数字式循环

    FOR循环计数器IN[REVERSE ] 下限.. 上限LOOP
    要执行的语句;
    END LOOP;


    每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。
    跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT退出循环。

    例:使用循环语句打印 1 - 100.(三种方式)

    1). LOOP ... EXIT WHEN ... END LOOP
     

    declare
    --初始化条件
    v_i number(3) := 1;
    begin
    loop
    --循环体
    dbms_output.put_line(v_i);
    --循环条件
    exit when v_i = 100;
    --迭代条件
    v_i := v_i + 1;
    end loop;
    end;

    2). WHILE ... LOOP ... END LOOP
     

    declare
    --初始化条件
    v_i number(3) := 1;
    begin
    --循环条件
    while v_i <= 100 loop
    --循环体
    dbms_output.put_line(v_i);
    --迭代条件
    v_i := v_i + 1;
    end loop;
    end;

    3).
     

    begin
    for i in 1 .. 100 loop
    dbms_output.put_line(i);
    end loop;
    end;

    例: 综合使用 if, while 语句, 打印 1 - 100 之间的所有素数
    (素数: 有且仅用两个正约数的整数, 2, 3, 5, 7, 11, 13, ...).

    declare
    v_i int := 2;
    v_j int := 2;
    v_flag boolean := false;
    begin
    while v_i < 100 loop
    v_j := 2;
    while v_j<sqrt(v_i) loop
    if mod(v_i,v_j) = 0 then
    v_flag := true;
    exit;
    end if;
    v_j := v_j + 1;
    end loop;
    if v_flag = false then
    dbms_output.put_line(v_i||',是素数');
    end if;
    v_flag := false;
    v_i := v_i +1;
    end loop;
    end;

    ④标号和GOTO
    PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:
    GOTO label;
    . . . . . .
    <<label>> /*标号是用<<>>括起来的标识符*/

    例:打印1——100的自然数,当打印到50时,跳出循环,输出“打印结束”
    (方法一)

    begin
    for i in 1..100 loop
    dbms_output.put_line(i);
    if(i = 50) then
    goto label;
    end if;
    end loop;
    
    <<label>>
    dbms_output.put_line('打印结束');
    
    end;

    (方法二)
     

    begin
    for i in 1..100 loop
    dbms_output.put_line(i);
    if(i mod 50 = 0) then
    dbms_output.put_line('打印结束');
    exit;
    end if;
    end loop;
    end;
  • 相关阅读:
    学习Kubernetes,这些负载均衡知识点得知道!
    Nginx请求处理流程
    字节跳动面试题+答案,答对了30+
    Cache 和 Buffer 的区别在哪里
    优化你的HTTPS(下),你需要这么做
    优化你的HTTPS(上),你需要这么做
    swift之Mac中NSSplitView的简单实用
    oc之mac中- NSBox
    Mac之NSImageView的简单实用
    swift之预防 Timer 的循环引用
  • 原文地址:https://www.cnblogs.com/BillLei/p/4605137.html
Copyright © 2011-2022 走看看