使用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;
/
declare
v_year date := to_date('2000-10-10','yyyy-mm-dd');
v_five_years boolean;
begin
if months_between(sysdate,v_year)/12 > 5
then
v_five_years := true;
else
v_five_years := false;
end if;
if v_five_years then
dbms_output.put_line('yes');
else
dbms_output.put_line('no');
end if;
end;
/
使用CASE表达式:
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;
/
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;
/
set serveroutput on
declare
v_score number := &score;
v_grade VARCHAR2(10) := 'no grade';
begin
v_grade :=
case to_char(trunc(v_score,-1))
when '90' then 'A'
when '80' then 'B'
when '70' then 'C'
else 'D'
end;
dbms_output.put_line(v_grade);
end;
循环遍历控制:
loop
...
end loop;
while ... loop
....
end loop;
for ... loop
...
end loop;
1.基本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循环:
for 后的变量类型 由in后面内容决定
如果后面是数值 变量就是数值类型
如果后面是select(游标) 变量就是 record
begin
for i in 1..10 loop
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
<
for i in 1..5 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;
<
dbms_output.put_line('end loop V_counter current value:'||V_counter);
end;
/
写一个PL/SQL块
向dept表中循环插入5条记录
每一条记录的deptno 值比表中最大的deptno 值增加1
dname分别为"Test1" "Test2"..."Test5"
loc列的值都为空。
sys>create table hr.dept as select * from scott.dept;
hr>
declare
v_deptno hr.dept.deptno%type;
begin
select max(deptno) into v_deptno from hr.dept;
for i in 1..5 loop
insert into hr.dept values(v_deptno+i,'Test'||to_char(i),null);
end loop;
end;
事务处理控制语句(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;
/
*********
drop table t1 purge;
create table t1 (id number);
begin
for i in 1..1000 loop
insert into t1 values(i);
if i mod 50 = 0
then
commit;
end if;
end loop;
end;
Plsql table+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;
/
declare
v_deptno hr.dept.deptno%type;
v_dname hr.dept.dname%type;
v_loc hr.dept.loc%type;
v_max number;
begin
select count(*) into v_max from hr.dept;
for i in 1..v_max loop
select deptno,dname,loc into v_deptno,v_dname,v_loc
from (select rownum rn,d.* from hr.dept d)
where rn=i;
dbms_output.put_line(v_deptno||' '||v_dname||' '||v_loc);
end loop;
end;
/