Oracle控制结构

1、IF语句

 2、CASE语句的语法格式:

CASE [selector]
    WHEN  表达式1   THEN 语句序列1;
    WHEN  表达式2   THEN  语句序列2;
    WHEN  表达式3  THEN   语句序列3;
    ….
   WHEN  表达式n  THEN   语句序列n;
     [ ELSE   语句序列n+1;]
END [CASE];
  • selector表达式可以任意复杂,可以包含函数的调用,通常只由单个变量组成.
  • selector表达式只计算一次。
  • 表达式产生的值可以是除了BLOB、BFILE、对象类型、PL/SQL记录类型、索引表类型、变长数组类型、嵌套表类型以外的所有类型

例1:根据ORDERDETAILS表中某产品的总销量分别对其销量进行评定,并输出为优秀、很好、较好、较差、很差

DECLARE
  TYPE rec_prodquant  IS RECORD
   (v_prod orderdetails.productid%type,
    v_sumquantity orderdetails.quantity%type  );
   rec_prod rec_prodquant; --存放产品编号,总销量的记录类型
  v_jg varchar2(20); --存放优秀、很好、较好、较差、很差等值
BEGIN
   --查询出某产品的编号和总销量存放到记录变量中
SELECT productid,sum(quantity)  INTO rec_prod
   FROM orderdetails
   WHERE productid=&no
  group by productid;
  --根据总销量判断其销量的档次
CASE
    WHEN rec_prod.v_sumquantity>=50 THEN  v_jg:='销量优秀' ;
     WHEN rec_prod.v_sumquantity>=40 THEN  v_jg:='销量很好';
     WHEN rec_prod.v_sumquantity>=30 THEN v_jg:='销量较好' ;
     WHEN rec_prod.v_sumquantity>=10 THEN  v_jg:='销量较差';
     ELSE     v_jg:='销量很差';
 END CASE;
--输出产品编号、总销量、销量的档次
    dbms_output.put_line(rec_prod.v_prod || '      ' || rec_prod.v_sumquantity ||  '      ' || v_jg);
  END;

 3、LOOP循环

 例2:创建一个测试表,包含列ID,NAME两个列,并向该表插入50条测试记录

DECLARE
v_Loop  integer:= 1;
BEGIN
 LOOP
     INSERT INTO test
     VALUES (v_Loop,‘a’|| v_Loop);
     v_Loop:= v_Loop + 1;
  EXIT WHEN v_Loop > 50;双竖线(||):Oracle使用双竖线表示字符串连接函数
 END LOOP;
END;

4、WHILE循环

while循环是当控制条件为真时,重复执行循环体内的语句;当控制条件不再为真时,终止循环体内的语句执行。

语法格式:
WHILE condition
  LOOP
           执行语句段;
END LOOP;

例3 向表test_table插入50条测试记录(WHILE循环)

DECLARE
v_Loop binary_integer := 1;
BEGIN
  WHILE V_loop<=50
  LOOP
     INSERT INTO test
     VALUES (v_Loop,‘a’);
     v_loop:=v_loop+1;
  END LOOP;
END;

5、FOR循环

一般用于有限次地重复执行一组语句。其循环次数由计数器来指定。

语法格式FOR 循环变量 IN [reverse] 循环下界..循环上界
    LOOP
      循环处理语句段;
    END LOOP;

 说明:

  •  循环控制变量不需要在DECLARE中显式定义;系统隐含将它声明为binary_integer变量;
  •  reverse  表示索引变量的值从大到小;
  • 循环变量只能在循环体中使用,不能再循环体外使用。

例4:向表test_table插入50条测试记录(FOR循环)

BEGIN
  FOR v_loop IN REVERSE 1..50
  LOOP
     INSERT INTO test_table (ID,NAME)
     VALUES (v_Loop,’a’||v_loop);
  END LOOP;
END;
posted @ 2020-12-03 20:31  重雪  阅读(142)  评论(0编辑  收藏  举报