PL/SQL 编写控制结构

2 篇文章 0 订阅
2 篇文章 0 订阅

1.条件分支语句(IF, CASE)
简单条件判断

DECLARE 
 v_sal NUMBER(6,2);
BEGIN 
 SELECT sal INTO v_sal FROM emp
 WHERE lower(ename) = lower('&&name');
 IF v_sal<2000 THEN
     UPDATE emp SET sal=v_sal + 200
    WHERE lower(ename)=lower('&name')
 END IF;
END;
二重条件分支
DECLARE
 v_comm NUMBER(6,2);
BEGIN
 SELECT comm INTO v_comm FROM emp 
 WHERE empno=&&no;
 IF v_comm <> 0 THEN 
     UPDATE emp SET comm = v_comm +100
    WHERE empno=&no;
 ELSE
     UPDATE emp SET comm200
    WHERE empno=&no;
 END IF;
END;

多重条件分支

undefine no

DECLARE
 v_job VARCHAR2(10);
 v_sal NUMBER(6,2);
BEGIN 
 SELECT job,sal INTO v_job,v_sal
 FROM emp WHERE empno=&&no;
 IF v_job='PRESIDENT' THEN
     UPDATE emp SET sal=v_val + 1000 WHERE empno=&no;
 ELSIF v_job='MANAGER' THEN
     UPDATE emp SET sal=v_sal + 500 WHERE empno=&no;
 ELSE 
     UPDATE emp SET sal = v_sal+200 WHERE empno=&no;
 END IF;
END;

    CASE 语句
可以用CASE 语句来执行多重分支操作。使用CASE语句更加便捷,而且执行效率更好。 
建议使用CASE语句。
使用CASE语句处理多重条件分支有两种方法。 
a.使用单一选择符进行等值比较。
CASE selector
    WHEN  expression1 THEN sequence_of_statements1;
    WHEN  expression2 THEN sequence_of_statements2;
    ...
    WHEN  expressionN THEN sequence_of_statemnetsN;
    [ELSE sequence_of_statementsN+1;]
END CASE;
为了避免CASE_NOT_FOUND 例外, 在编写CASE语句时候,应该加上ELSE子句。 
例:
DECLARE
 v_deptno emp.deptno%TYPE;
BEGIN
 v_deptno:=&no;
 CASE v_deptno 
  WHEN 10 THEN
      UPDATE emp SET comm=100 WHERE deptno=v_deptno;
  WHEN 20 THEN
      UPDATE emp SET COMM=80 WHERE deptno=v_deptno;
  WHEN 30 THEN
      UPDATE emp SET comm=50 WHERE deptno=v_deptno;
  ELSE
      dbms_output.put_lin('不存在该部门');
 END CASE;
END;

b.使用多种条件进行非等值比较。
CASE 
    WHEN search_condition1 THEN sequence_of_statements1;
    WHEN search_condition2 THEN sequence_of_statements2;
    ...
    WHEN search_conditionN THEN sequence_of_statementsN;
    [ELSE sequence_of_statementsN+1;]
END CASE;
为了避免CASE_NOT_FOUND 例外, 在编写CASE语句时候,应该加上ELSE子句。 
DECLARE
 v_sal emp.sal%TYPE;
 v_ename emp.ename%TYPE;
BEGIN
 SELECT ename,sal INTO v_ename, v_sal
 FROM emp WHERE empno=&no;
 CASE
  WHEN v_sal<1000 THEN 
      UPDATE emp SET comm=100 WHERE ename=v_ename;
  WHEN v_sal<2000 THEN
      UPDATE emp SET comm=80 WHERE ename=v_ename;
  WHEN v_sal<6000 then 
      UPDATE     emp SET comm=50 WHERE ename=v_ename;
 END CASE;
END;


2.循环语句 (LOOP)
分为基本循环,WHILE循环,FOR循环
基本循环
LOOP
    statement1;
    ...
    EXIT [WHEN condition];
END LOOP;
当使用基本循环时,无论是否满足条件,语句至少会被执行一次。当condition为TRUE时,会退出循环,并执行END LOOP后的相应操作。 
另,在用基本循环时,还应该定义循环控制变量,并在循环体内修改循环控制变量的值。 

SQL> CREATE TABLE temp(cola INT);
表已创建。
DECLARE
 i INT:=1;
BEGIN 
 LOOP
    INSERT INTO temp VALUES(i);
    EXIT WHEN i=10;
    i:=i+1;
 END LOOP;
END;

WHILE 循环
基本循环至少执行一次循环体内的语句,而对于WHILE 循环来说,只有条件为TRUE时,才会执行循环体内的语句。
WHILE循环以WHILE...LOOP开始,以END LOOP结束。 
语法如下:
WHILE conditon LOOP
    statement1;
    statement2;
    ...
END LOOP;

DECLARE 
 i INT :=1;
BEGIN
 WHILE i<=10 LOOP
  INSERT INTO temp VALUES()i;
  i:=i+1;
 END LOOP
END;


FOR 循环

FOR counter in [REVERSE]
lower_bound..upper_bound LOOP
    statement1;
    statement2;
    ...
END LOOP;

BEGIN
 FOR i IN REVERSE 1...10 LOOP
     INSERT INTO temp VALUES(i);
 END LOOP;
END;
 因为上面指定了REVERSE选项,所以被插入数据的顺序是10,9...,1


嵌套循环和标号
嵌套循环是指在一个循环语句之中嵌入另一个循环语句。而标号(Label)则用于标号嵌套块或嵌套循环。
通过在嵌套循环中使用标号 可以区分内层循环和外层循环,并且可以再内层循环中直接退出外层循环。 
在编写PL/SQL块时,可以使用<<label_name>>定义标号

DECLARE
result INT;
BEGIN
<<outer>>
FOR i IN 1...100 LOOP
<<inter>>
FOR j IN 1...100 LOOP
result := i*j;
EXIT outer WHEN result=1000;
EXIT WHEN result=500;
END LOOP inner;
dbms_output.put_line(result);
END LOOP outer;
dbms_output.put_line(result);
END;
如果result=1000,直接退出外层循环, 500时,只退出内层循环。


3.顺序控制语句 (GOTO, NULL)

1.GOTO 语句
GOTO语句用于跳转到特定标号处去执行语句。 
使用GOTO 语句会增加程序的复杂性,并使得程序可读性变差。所以,一般建议不要使用GOTO

GOTO lable_name;
label_name 是已经定义的标号名。注意,GOTO跳转到指定标号时候,标号后至少要包含一条可执行语句。
DECLARE
 i INT :=1;
 BEGIN
  LOOP 
  INSERT INTO temp VALUES(i);
  IF i=10 THEN
    GOTO end_loop;
  END IF;
  i:=i+1;
  END LOOP;
<<end_loop>>
  dbms_output.put_line('循环结束');
END;

2. NULL语句
NULL语句不会执行任何操作,并且会直接将控制传递到下一条语句。使用NULL语句主要好处,提高PL/SQL程序的可读性。

DECLARE
 v_sal emp.sal%TYPE;
 v_ename emp.ename%TYPE;
BEGIN
 SELECT ename,sal INTO v_ename,v_sal
 FROM emp WHERE empno=&no;
 IF v_sal<3000 THEN
     UPDATE emp SET comm=sal*0.1 WHERE ename=v_ename;
 ELSE 
     NULL;
 END IF;
END;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值