首页 > 其他 > 详细

PL学习-Control

时间:2020-05-16 13:03:42      阅读:47      评论:0      收藏:0      [点我收藏+]

学习文档:

 

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/lnpls/plsql-control-statements.html#GUID-18777904-23F6-4F6D-8B41-46BABF00BA03

note, 下面的例子来自官方参考文档

 

1. if语句

if  then else elsif end if

 

DECLARE
  PROCEDURE p (sales NUMBER)
  IS
    bonus  NUMBER := 0;
  BEGIN 
    IF sales > 50000 THEN
      bonus := 1500;
    ELSIF sales > 35000 THEN
      bonus := 500;
    ELSE
      bonus := 100;
    END IF;
    DBMS_OUTPUT.PUT_LINE (
      ‘Sales = ‘ || sales || ‘, bonus = ‘ || bonus || ‘.‘
    );
  END p;
BEGIN
  p(55000);
  p(40000);
  p(30000);
END;
/

2. case语句

case语句有两种,一个simple case,一个是searched case

 

DECLARE
  grade CHAR(1);
BEGIN
  grade := ‘B‘;
  CASE grade
    WHEN ‘A‘ THEN DBMS_OUTPUT.PUT_LINE(‘Excellent‘);
    WHEN ‘B‘ THEN DBMS_OUTPUT.PUT_LINE(‘Very Good‘);
    WHEN ‘C‘ THEN DBMS_OUTPUT.PUT_LINE(‘Good‘);
    WHEN ‘D‘ THEN DBMS_OUTPUT.PUT_LINE(‘Fair‘);
    WHEN ‘F‘ THEN DBMS_OUTPUT.PUT_LINE(‘Poor‘);
    ELSE DBMS_OUTPUT.PUT_LINE(‘No such grade‘);
  END CASE;
END;
/

 

DECLARE
  grade CHAR(1);
BEGIN
  grade := ‘B‘;
  CASE
    WHEN grade = ‘A‘ THEN DBMS_OUTPUT.PUT_LINE(‘Excellent‘);
    WHEN grade = ‘B‘ THEN DBMS_OUTPUT.PUT_LINE(‘Very Good‘);
    WHEN grade = ‘C‘ THEN DBMS_OUTPUT.PUT_LINE(‘Good‘);
    WHEN grade = ‘D‘ THEN DBMS_OUTPUT.PUT_LINE(‘Fair‘);
    WHEN grade = ‘F‘ THEN DBMS_OUTPUT.PUT_LINE(‘Poor‘);
    ELSE DBMS_OUTPUT.PUT_LINE(‘No such grade‘);
  END CASE;
END;
/

3. loop语句

1) loop 语句

[ label ] LOOP

 statements

END LOOP [ label ];

 

note:

loop语句里需要exit语句,否则是无限循环

2)exit语句

技术分享图片

 

loop 与 exit的例子

 

DECLARE
  s  PLS_INTEGER := 0;
  i  PLS_INTEGER := 0;
  j  PLS_INTEGER;
BEGIN
  <<outer_loop>>
  LOOP
    i := i + 1;
    j := 0;
    <<inner_loop>>
    LOOP
      j := j + 1;
      s := s + i * j; -- Sum several products
      EXIT inner_loop WHEN (j > 5);
      EXIT outer_loop WHEN ((i * j) > 15);
    END LOOP inner_loop;
  END LOOP outer_loop;
  DBMS_OUTPUT.PUT_LINE
    (‘The sum of products equals: ‘ || TO_CHAR(s));
END;
/

3) continue语句

技术分享图片

4) while loop

 

[ label ] WHILE condition LOOP
  statements
END LOOP [ label ];

 

note: exit, continue可以用于while loop

 

DECLARE
  done  BOOLEAN := FALSE;
BEGIN
  WHILE done LOOP
    DBMS_OUTPUT.PUT_LINE (‘This line does not print.‘);
    done := TRUE;  -- This assignment is not made.
  END LOOP;
  WHILE NOT done LOOP
    DBMS_OUTPUT.PUT_LINE (‘Hello, world!‘);
    done := TRUE;
  END LOOP;
END;
/

5) for 语句

 

[ label ] FOR index IN [ REVERSE ] lower_bound..upper_bound LOOP
  statements
END LOOP [ label ];

note:

a. 这里的for语法同cursor的for不一样,需要注意

b. exit, continue语句都可以用

c. index 不需要声明(PLS_INTEGER类型),不能修改,生命期在循环中

 

BEGIN
  DBMS_OUTPUT.PUT_LINE (‘lower_bound < upper_bound‘);
  FOR i IN 1..3 LOOP
    DBMS_OUTPUT.PUT_LINE (i);
  END LOOP;
  DBMS_OUTPUT.PUT_LINE (‘lower_bound = upper_bound‘);
  FOR i IN 2..2 LOOP
    DBMS_OUTPUT.PUT_LINE (i);
  END LOOP;
  DBMS_OUTPUT.PUT_LINE (‘lower_bound > upper_bound‘);
  FOR i IN 3..1 LOOP
    DBMS_OUTPUT.PUT_LINE (i);
  END LOOP;
END;
/

 

6) forall语句

batch的发送同样的dml sql

note:

  1. forall中只能有一个dml sql语句, for语句可以有多条
  2. forall比for语句快

 

 

DROP TABLE employees_temp;
CREATE TABLE employees_temp AS SELECT * FROM employees;
DECLARE
  TYPE NumList IS VARRAY(10) OF NUMBER;
  depts NumList := NumList(5,10,20,30,50,55,57,60,70,75);
BEGIN
  FORALL j IN 4..7
    DELETE FROM employees_temp WHERE department_id = depts(j);
END;
/

4. goto语句

技术分享图片

goto语句限制:

  1. 不能goto到if内部
  2. 不能goto到end;(用null;解决这个问题)

 

 

DECLARE
  done  BOOLEAN;
BEGIN
  FOR i IN 1..50 LOOP
    IF done THEN
      GOTO end_loop;
    END IF;
    <<end_loop>>
    NULL;  ----- 一定要有null;语句
  END LOOP;
END;
/

5. null语句

null;

占位用的

 

PL学习-Control

原文:https://www.cnblogs.com/fqguo24/p/12899492.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!