Oracle兼容-存储过程-EXIT WHEN


1. 语法

  1. EXIT (label) / EXIT (label) WHEN

2. 定义和用法

GreatSQL存储过程中支持用 EXIT (label)/EXIT (label) WHEN 退出当前循环。该用法如下所述:

  1. 退出时可带标签,也可不带标签。

  2. 支持多种退出循环判断条件,包括 EXIT WHEN cursor%FOUND / %NOTFOUND / %ISOPEN 等多种判断条件。

3. 示例

创建测试表并初始化数据

  1. greatsql> CREATE TABLE t1 (a INT NOT NULL, b VARCHAR(20) NOT NULL);
  2. greatsql> INSERT INTO t1 VALUES(1, 'row1'), (2, 'row2'), (3,'row3') ;
    1. 示例1
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> DELIMITER //
  3. greatsql> CREATE OR REPLACE PROCEDURE sp_loop1() AS
  4. CURSOR cur1 IS SELECT a, b FROM t1 WHERE a>1;
  5. BEGIN
  6. <<forLoop>>
  7. FOR rec IN cur1 LOOP
  8. SELECT rec.a ,rec.b;
  9. EXIT; -- 只循环一次就退出
  10. END LOOP forLoop;
  11. SELECT 'AFTER LOOP';
  12. END; //
  13. greatsql> CALL sp_loop1() //
  14. +-------+-------+
  15. | rec.a | rec.b |
  16. +-------+-------+
  17. | 2 | row2 |
  18. +-------+-------+
  19. 1 row in set (0.00 sec)
  20. +------------+
  21. | AFTER LOOP |
  22. +------------+
  23. | AFTER LOOP |
  24. +------------+
  25. 1 row in set (0.00 sec)
  26. Query OK, 0 rows affected (0.00 sec)
    1. 示例2
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> DELIMITER //
  3. greatsql> CREATE OR REPLACE PROCEDURE sp_loop2() AS
  4. CURSOR cur1 IS SELECT a, b FROM t1 WHERE a>1;
  5. BEGIN
  6. <<forLoop>>
  7. FOR rec IN cur1 LOOP
  8. EXIT forLoop; -- 一次都没循环成功,直接退出
  9. SELECT rec.a ,rec.b;
  10. END LOOP forLoop;
  11. SELECT 'AFTER LOOP';
  12. END; //
  13. greatsql> CALL sp_loop2() //
  14. +------------+
  15. | AFTER LOOP |
  16. +------------+
  17. | AFTER LOOP |
  18. +------------+
  19. 1 row in set (0.00 sec)
  20. Query OK, 0 rows affected (0.00 sec)
    1. 示例3
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> DELIMITER //
  3. greatsql> CREATE OR REPLACE PROCEDURE sp_loop3() AS
  4. CURSOR cur1 IS SELECT a, b FROM t1;
  5. BEGIN
  6. <<forLoop>>
  7. FOR rec IN cur1 LOOP
  8. SELECT rec.a ,rec.b;
  9. EXIT when cur1%NOTFOUND;
  10. END LOOP forLoop;
  11. SELECT 'AFTER LOOP';
  12. END; //
  13. greatsql> CALL sp_loop3() //
  14. +-------+-------+
  15. | rec.a | rec.b |
  16. +-------+-------+
  17. | 1 | row1 |
  18. +-------+-------+
  19. 1 row in set (0.00 sec)
  20. +-------+-------+
  21. | rec.a | rec.b |
  22. +-------+-------+
  23. | 2 | row2 |
  24. +-------+-------+
  25. 1 row in set (0.00 sec)
  26. +-------+-------+
  27. | rec.a | rec.b |
  28. +-------+-------+
  29. | 3 | row3 |
  30. +-------+-------+
  31. 1 row in set (0.01 sec)
  32. +------------+
  33. | AFTER LOOP |
  34. +------------+
  35. | AFTER LOOP |
  36. +------------+
  37. 1 row in set (0.01 sec)
  38. Query OK, 0 rows affected (0.01 sec)
    1. 示例4
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> DELIMITER //
  3. greatsql> CREATE OR REPLACE PROCEDURE sp_loop4() AS
  4. CURSOR cur1 IS SELECT a, b FROM t1;
  5. BEGIN
  6. <<forLoop>>
  7. FOR rec IN cur1 LOOP
  8. SELECT rec.a ,rec.b;
  9. EXIT forLoop when cur1%NOTFOUND;
  10. END LOOP forLoop;
  11. SELECT 'AFTER LOOP';
  12. END; //
  13. greatsql> CALL sp_loop4() //
  14. +-------+-------+
  15. | rec.a | rec.b |
  16. +-------+-------+
  17. | 1 | row1 |
  18. +-------+-------+
  19. 1 row in set (0.00 sec)
  20. +-------+-------+
  21. | rec.a | rec.b |
  22. +-------+-------+
  23. | 2 | row2 |
  24. +-------+-------+
  25. 1 row in set (0.00 sec)
  26. +-------+-------+
  27. | rec.a | rec.b |
  28. +-------+-------+
  29. | 3 | row3 |
  30. +-------+-------+
  31. 1 row in set (0.00 sec)
  32. +------------+
  33. | AFTER LOOP |
  34. +------------+
  35. | AFTER LOOP |
  36. +------------+
  37. 1 row in set (0.00 sec)
  38. Query OK, 0 rows affected (0.00 sec)

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx