• PL/SQL 程序可通过条件或循环结构来控制命令执行的流程。
• PL/SQL 提供了丰富的流程控制语句,与 Java 一样也有三种控制结构:
• 顺序结构
• 选择结构
• 循环结构
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;
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 语句。
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;
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;
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;
• 在 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;