Oracle兼容-存储过程-FOR LOOP


1. 语法

  1. FOR var IN [REVERSE] expr1 .. expr2 LOOP .. END LOOP

2. 定义和用法

在GreatSQL中支持用 FOR .. IN expr1 .. expr2 LOOP .. END LOOP 语法循环读取数据,并赋值给相应变量。

3. Oracle兼容说明

ORACLE 模式下,GreatSQL存储过程支持 FOR .. LOOP 用法。该用法如下所述:

  1. 不需要事先声明 FOR LOOP 中的变量 var,直接使用 FOR var IN expr1 .. expr2 LOOP 语法即可。

  2. 支持增加 REVERSE 关键字,可以实现倒序获取数据目的。

  3. 循环中的 expr1/expr2 支持数值类型变量、数值、函数以及表达式等。expr1/expr2 如果是 FLOAT 类型则会被转换成 INT 型(转换时会做四舍五入处理)。

  4. 如果 expr1/expr2 是时间类型,则会被转换为数值类型进行计算,而不是按照时间规则进行加减计算。在Oracle中不支持该类型,会产生报错。

  5. 在循环 FOR var IN 中的变量 var 如果是 FLOAT 类型则会被转换成 INT 型(转换时会做四舍五入处理)。

4. 示例

    1. 示例1
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> DELIMITER //
  3. greatsql> CREATE OR REPLACE PROCEDURE p1(i FLOAT, j FLOAT) AS
  4. BEGIN
  5. FOR x IN i .. j LOOP
  6. SELECT x;
  7. END LOOP;
  8. END; //
  9. greatsql> CALL p1(1.5, 3.4) //
  10. +------+
  11. | x |
  12. +------+
  13. | 2 |
  14. +------+
  15. 1 row in set (0.00 sec)
  16. +------+
  17. | x |
  18. +------+
  19. | 3 |
  20. +------+
  21. 1 row in set (0.00 sec)
  22. Query OK, 0 rows affected (0.00 sec)
  23. greatsql> CALL p1(1.4,3.5) //
  24. +------+
  25. | x |
  26. +------+
  27. | 1 |
  28. +------+
  29. 1 row in set (0.00 sec)
  30. +------+
  31. | x |
  32. +------+
  33. | 2 |
  34. +------+
  35. 1 row in set (0.00 sec)
  36. +------+
  37. | x |
  38. +------+
  39. | 3 |
  40. +------+
  41. 1 row in set (0.00 sec)
  42. +------+
  43. | x |
  44. +------+
  45. | 4 |
  46. +------+
  47. 1 row in set (0.00 sec)
  48. Query OK, 0 rows affected (0.00 sec)
  49. greatsql> CALL p1(1.5, 3.4) //
  50. +------+
  51. | x |
  52. +------+
  53. | 2 |
  54. +------+
  55. 1 row in set (0.00 sec)
  56. +------+
  57. | x |
  58. +------+
  59. | 3 |
  60. +------+
  61. 1 row in set (0.00 sec)
  62. Query OK, 0 rows affected (0.00 sec)

可以看到,当传入参数是 FLOAT 类型是,会被转换成 INT 型(转换时会做四舍五入处理)。

    1. 示例2
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> DELIMITER //
  3. greatsql> CREATE OR REPLACE PROCEDURE p1(i FLOAT, j FLOAT) AS
  4. BEGIN
  5. -- 倒序
  6. FOR x IN REVERSE i .. j LOOP
  7. SELECT x;
  8. END LOOP;
  9. END; //
  10. greatsql> CALL p1(1.5, 3.4) //
  11. +------+
  12. | x |
  13. +------+
  14. | 3 |
  15. +------+
  16. 1 row in set (0.00 sec)
  17. +------+
  18. | x |
  19. +------+
  20. | 2 |
  21. +------+
  22. 1 row in set (0.00 sec)
  23. Query OK, 0 rows affected (0.00 sec)
  24. greatsql> CALL p1(1.4, 3.5) //
  25. +------+
  26. | x |
  27. +------+
  28. | 4 |
  29. +------+
  30. 1 row in set (0.00 sec)
  31. +------+
  32. | x |
  33. +------+
  34. | 3 |
  35. +------+
  36. 1 row in set (0.00 sec)
  37. +------+
  38. | x |
  39. +------+
  40. | 2 |
  41. +------+
  42. 1 row in set (0.00 sec)
  43. +------+
  44. | x |
  45. +------+
  46. | 1 |
  47. +------+
  48. 1 row in set (0.00 sec)
  49. Query OK, 0 rows affected (0.00 sec)
  50. greatsql> CALL p1(1.5, 3.4) //
  51. +------+
  52. | x |
  53. +------+
  54. | 3 |
  55. +------+
  56. 1 row in set (0.00 sec)
  57. +------+
  58. | x |
  59. +------+
  60. | 2 |
  61. +------+
  62. 1 row in set (0.00 sec)
  63. 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 p1(i FLOAT, j FLOAT) AS
  4. val FLOAT := 1.2;
  5. BEGIN
  6. FOR x IN i .. j LOOP
  7. -- 循环内部再加上一个 FLOAT 类型值
  8. val := val + x;
  9. SELECT val;
  10. END LOOP;
  11. END; //
  12. greatsql> CALL p1(1.5, 3.4) //
  13. +------+
  14. | val |
  15. +------+
  16. | 3.2 |
  17. +------+
  18. 1 row in set (0.00 sec)
  19. +------+
  20. | val |
  21. +------+
  22. | 6.2 |
  23. +------+
  24. 1 row in set (0.00 sec)
  25. Query OK, 0 rows affected (0.00 sec)
  26. greatsql> CALL p1(1.4, 3.5) //
  27. +------+
  28. | val |
  29. +------+
  30. | 2.2 |
  31. +------+
  32. 1 row in set (0.00 sec)
  33. +------+
  34. | val |
  35. +------+
  36. | 4.2 |
  37. +------+
  38. 1 row in set (0.00 sec)
  39. +------+
  40. | val |
  41. +------+
  42. | 7.2 |
  43. +------+
  44. 1 row in set (0.01 sec)
  45. +------+
  46. | val |
  47. +------+
  48. | 11.2 |
  49. +------+
  50. 1 row in set (0.01 sec)
  51. Query OK, 0 rows affected (0.01 sec)
  52. greatsql> CALL p1(1.5, 3.4) //
  53. +------+
  54. | val |
  55. +------+
  56. | 3.2 |
  57. +------+
  58. 1 row in set (0.00 sec)
  59. +------+
  60. | val |
  61. +------+
  62. | 6.2 |
  63. +------+
  64. 1 row in set (0.00 sec)
  65. Query OK, 0 rows affected (0.00 sec)

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx