oracle程序流程控制,oracle PL/SQL 流程控制

使用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;/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值