数据库
首页 > 数据库> > Oracle学习笔记十九:PL/SQL流程控制语句

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;

 

标签:语句,end,循环,emp,SQL,Oracle,where,PL
来源: https://www.cnblogs.com/atomy/p/16341080.html