• Oracle学习笔记十九:PL/SQL流程控制语句


    一、引言

    • PL/SQL 程序可通过条件或循环结构来控制命令执行的流程。

    • PL/SQL 提供了丰富的流程控制语句,与 Java 一样也有三种控制结构:

      • 顺序结构

      • 选择结构

      • 循环结构

    二、选择结构

    2.1、IF-THEN

    1)IF-THEN

    该结构先判断一个条件是否为 TRUE,条件成立则执行对应的语句块,与 Java 中的 if 语句很相似。

    declare
        newsal emp.sal%type;
    begin
        select sal into newsal from emp where ename='James';
        if newsal>=1500 then
            update emp set comm=1000 where ename='James';
        end if;
        commit;
    end;

    2)IF-THEN-ELSE

    declare
        newsal emp.sal%type;
    begin
        select sal into newsal from emp where ename='James';
        if newsal>=1500 then
            update emp set comm=1000 where ename='James';
        else
            update emp set comm=100 where ename='James';
        end if;
        commit;
    end;

    3)IF-THEN-ELSIF

    declare
        newsal emp.sal%type;
    begin
        select sal into newsal from emp where ename='James';
        if newsal>=1500 then
            update emp set comm=1000 where ename='James';
        elsif newsal>=1000 then
            update emp set comm=800 where ename='James';
        else
            update emp set comm=400 where ename='James';
        end if;
        commit;
    end;

    2.2、CASE

    CASE 是一种选择结构的控制语句,可以根据条件从多个执行分支中选择相应的执行动作。也可以作为表达式使用,返回一个值。类似 Java 中的 switch 语句:

    declare
        v_grade char(1) := upper('&p_grade');
    begin
        case v_grade
            when 'A' then
                dbms_output.put_line('A');
            when 'B' then
                dbms_output.put_line('B');
            when 'C' then
                dbms_output.put_line('C');
            else
                dbms_output.put_line('not found char!');
        end case;
    end;

    三、循环结构

    Oracle PL/SQL提供的循环类型有:

      • 无条件循环 LOOP-END LOOP 语句

      • WHILE 循环语句

      • FOR 循环语句

    除了以上循环结构外,PL/SQL中还提供了EXIT用于强制退出循环,类似于 Java 中的 break 语句。

    3.1、LOOP

    LOOP 循环是最简单的循环,也称为无限循环,LOOP 和 END LOOP 是关键字。

    declare
        v_sum number(10) :=0;
        i number(10) :=1;
    begin
        loop
            v_sum:=v_sum+i;
            i:=i+1;
            if i>100 then
                exit;
            end if;
        end loop;
        dbms_output.put_line(v_sum);
    end;

    3.2、WHILE

    WHILE 循环与 Java 中的 while 循环很类似。先判断条件,条件成立再执行循环体。

    declare
        v_sum number(10) :=0;
        i number(10) :=1;
    begin
        while i<=100 loop
            v_sum:=v_sum+i;
            i:=i+1;
        end loop;
        dbms_output.put_line(v_sum);
    end;

    3.3、FOR

    FOR 循环需要预先确定的循环次数,可通过给循环变量指定下限和上限来确定循环的次数,然后循环变量在每次循环中递增(或者递减)。

    declare
        v_sum number(10) :=0;
        i number(10) :=1;
    begin
        for i in 1..100 loop
            v_sum:=v_sum+i;
        end loop;
        dbms_output.put_line(v_sum);
    end;

    四、动态SQL

    • 在 PL/SQL 程序开发中,可以使用 DML 语句和事务控制语句,但是还有很多语句(比如 DDL 语句)不能直接在 PL/SQL 中执行,这些语句可以使用动态 SQL 来实现。

    • PL/SQL 块先编译然后执行,动态 SQL 语句在编译时不能确定,只有在程序执行时把 SQL 语句作为字符串的形式由动态 SQL 命令来执行。

    • 在编译阶段 SQL 语句作为字符串存在,程序不会对字符串中的内容进行编译,在运行阶段再对字符串中的 SQL 语句进行编译和执行。

    语法格式:动态 SQL

      EXECUTE IMMEDIATE 动态语句字符串

      [INTO 变量列表]

      [USING 参数列表]

      • 如果动态语句是 SELECT 语句,可以把查询的结果保存到 INTO 后面的变量中。如果动态语句中存在参数,USING 为语句中的参数传值。

      • 动态 SQL 中的参数格式是:[:参数名],参数在运行时需要使用 USING 传值。

    declare
        v_sql varchar2(128);
        v_sal emp.sal%type;
        v_empno emp.empno%type := '1001';
    begin
        --执行动态查询
        execute immediate 'create table loginuser (id varchar2(10) primary key,name varchar2(20) not null)';
        v_sql:='select sal from emp where empno=''1001''';
        execute immediate v_sql into v_sal;
        dbms_output.put_line(v_sal);
        
        --执行带参查询
        v_sql:='select sal from emp where empno=:1';
        execute immediate v_sql into v_sal using v_empno;
        dbms_output.put_line(v_sal);
    end;
  • 相关阅读:
    Java泛型T与?
    json解析出现:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX
    Html 项目使用自定义字体文件问题
    修复 WordPress 通过邮箱 找回密码时的链接无效&新用户注册时提示的链接无效
    Linux查询进程和结束进程
    Linux --- 程序后台运行的几种方法
    bash_profile和bashsrc的区别
    在CentOS中安装与配置Server JRE 8
    JRE和JDK的区别
    java中静态代码块详解
  • 原文地址:https://www.cnblogs.com/atomy/p/16341080.html
Copyright © 2020-2023  润新知