使用IF语句按条件判断,控制PL/SQL执行流程
格式如下:
if-then-end if;
if-then-else-end if;
if-then-elsif-then-else-end if;
演示:
set serveroutput on declare v_hire_date date := to_date('1995-01-15','yyyy-mm-dd'); v_five_years boolean; begin if months_between(sysdate,v_hire_date)/12 > 5 then v_five_years := true; dbms_output.put_line('true'); else v_five_years := false; dbms_output.put_line('false'); end if; end; /
使用CASE表达式
格式1:
set serveroutput on define p_grade='a' 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; /
格式2:
DECLARE v_grade CHAR(1) := UPPER('&p_grade'); v_appraisal VARCHAR2(20); BEGIN v_appraisal := CASE --省略 WHEN v_grade='A' THEN 'Excellent' WHEN v_grade='B' THEN 'Very Good' WHEN v_grade='C' THEN 'Good' ELSE 'No such grade' END; DBMS_OUTPUT.PUT_LINE ('Grade: '|| v_grade || ' Appraisal ' || v_appraisal); END; /
循环遍历控制
跳出整个循环:exit
跳出本次循环:continue (11g之后新加,10g没有此关键字)
continue演示:
declare total int:=0; begin for i in 1..10 loop if mod(i,2)=0 then continue; end if; total:=total+i; end loop; dbms_output.put_line(total); end; /
循环演示
基本LOOP循环:
set serveroutput on declare i integer :=1; begin loop dbms_output.put_line(i); i := i+1; exit when i>10; end loop; end; /
while循环
declare i integer :=1; begin while i<=10 loop dbms_output.put_line(i); i := i+1; end loop; end; /
数字for循环
begin for i in 1..10 loop --其中i不用声明就可以使用 dbms_output.put_line(i); end loop; end; / begin for i in reverse 1..10 loop --反向循环 dbms_output.put_line(i); end loop; end; /
实现双重循环
演示:
外循环和内循环都执行5次.
内外计数器变量名相同:i
显示内循环的计数器和外循环的计数器的乘积
当乘积超过15时候,退出
declare v_plus number(10); begin <<outer_loop>> for i in 1..5 loop <<inner_loop>> for i in 1..5 loop v_plus:=i*outer_loop.i; exit when v_plus>15; dbms_output.put_line(v_plus); end loop inner_loop; end loop outer_loop; end; /
标号和goto
declare v_counter number := 1; begin loop dbms_output.put_line('in loop V_counter current value:'||V_counter); v_counter := v_counter + 1; if v_counter > 10 then goto l_ENDofLOOP; end if; end loop; <<l_ENDofLOOP>> dbms_output.put_line('end loop V_counter current value:'||V_counter); end; /
练习
1、写一个PL/SQL块
向dept表中循环插入5条记录,每一条记录的deptno 值比表中最大的deptno 值增加1,dname分别为"Test1" "Test2"..."Test5",loc列的值都为空。
declare v_deptno scott.dept.deptno%type; v_loop number(1):=1; begin for i in 1..5 loop select MAX(deptno) into v_deptno from dept; insert into dept(deptno,dname) values ((v_deptno+1),('Test'||to_char(i))); commit; end loop; end; /
2、事务处理控制语句(COMMIT 和 ROLLBACK)
CREATE TABLE T1(ID INT); /*(批量提交,减少log file sync提高效率!)*/ DECLARE V_NUM NUMBER := 0; BEGIN FOR V_LOOPCOUNTER IN 1..500 LOOP INSERT INTO T1 VALUES (V_LOOPCOUNTER); V_NUM := V_NUM + 1; IF V_NUM = 50 THEN COMMIT; V_NUM := 0; END IF; END LOOP; COMMIT; END; /
3、Plsql表+record+循环打印结果集(dept表的所有行所有列)
declare TYPE CharacterTab IS TABLE OF dept%rowtype index by binary_integer; v_Character CharacterTab; v_max number; v_deptno number; begin select count(*) into v_max from dept; for i in 1..v_max loop select deptno into v_deptno from (select rownum rn,d.* from dept d) where rn=i; select * into v_Character(i) from dept where deptno=v_deptno; end loop; for i in 1..v_max loop dbms_output.put_line(v_Character(i).deptno||' '||v_Character(i).dname||' '||v_Character(i).loc); end loop; end; /
4、新建一张表(只有一列数字),插入1..520个数,每50个一提交。
declare j number :=1; begin for i in 1..520 loop insert into t7 values(i); if i-50*j=0 then commit; j :=j+1; end if; end loop; commit; end; /
5、for + pl/sql_table + record 实现将dept表所有行保存到pl/sql_table + record结构里并输出
declare type dept_table_type is table of dept%rowtype index by binary_integer; dept_table dept_table_type; v_max number; begin select count(*) into v_max from dept; for i in 1..v_max loop select deptno,dname,loc into dept_table(i) from (select rownum rn,deptno,dname,loc from dept) where rn=i; dbms_output.put_line(dept_table(i).deptno||' '||dept_table(i).dname||' '||dept_table(i).loc); end loop; end; /
来源:https://www.cnblogs.com/marxist/p/12247227.html