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 //

4. greatsql> CREATE OR REPLACE PROCEDURE p1(i FLOAT, j FLOAT) AS
5. BEGIN
6. FOR x IN i .. j LOOP
7. SELECT x;
8. END LOOP;
9. END; //

11. greatsql> CALL p1(1.5, 3.4) //
12. +------+
13. | x    |
14. +------+
15. |    2 |
16. +------+
17. 1 row in set (0.00 sec)

19. +------+
20. | x    |
21. +------+
22. |    3 |
23. +------+
24. 1 row in set (0.00 sec)

26. Query OK, 0 rows affected (0.00 sec)

28. greatsql> CALL p1(1.4,3.5) //
29. +------+
30. | x    |
31. +------+
32. |    1 |
33. +------+
34. 1 row in set (0.00 sec)

36. +------+
37. | x    |
38. +------+
39. |    2 |
40. +------+
41. 1 row in set (0.00 sec)

43. +------+
44. | x    |
45. +------+
46. |    3 |
47. +------+
48. 1 row in set (0.00 sec)

50. +------+
51. | x    |
52. +------+
53. |    4 |
54. +------+
55. 1 row in set (0.00 sec)

57. Query OK, 0 rows affected (0.00 sec)

59. greatsql> CALL p1(1.5, 3.4) //
60. +------+
61. | x    |
62. +------+
63. |    2 |
64. +------+
65. 1 row in set (0.00 sec)

67. +------+
68. | x    |
69. +------+
70. |    3 |
71. +------+
72. 1 row in set (0.00 sec)

74. Query OK, 0 rows affected (0.00 sec)

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

    1. 示例2
1. greatsql> SET sql_mode = ORACLE;
2. greatsql> DELIMITER //

4. greatsql> CREATE OR REPLACE PROCEDURE p1(i FLOAT, j FLOAT) AS
5. BEGIN
6. -- 倒序
7. FOR x IN REVERSE i .. j LOOP
8. SELECT x;
9. END LOOP;
10. END; //

12. greatsql> CALL p1(1.5, 3.4) //
13. +------+
14. | x    |
15. +------+
16. |    3 |
17. +------+
18. 1 row in set (0.00 sec)

20. +------+
21. | x    |
22. +------+
23. |    2 |
24. +------+
25. 1 row in set (0.00 sec)

27. Query OK, 0 rows affected (0.00 sec)

29. greatsql> CALL p1(1.4, 3.5) //
30. +------+
31. | x    |
32. +------+
33. |    4 |
34. +------+
35. 1 row in set (0.00 sec)

37. +------+
38. | x    |
39. +------+
40. |    3 |
41. +------+
42. 1 row in set (0.00 sec)

44. +------+
45. | x    |
46. +------+
47. |    2 |
48. +------+
49. 1 row in set (0.00 sec)

51. +------+
52. | x    |
53. +------+
54. |    1 |
55. +------+
56. 1 row in set (0.00 sec)

58. Query OK, 0 rows affected (0.00 sec)

60. greatsql> CALL p1(1.5, 3.4) //
61. +------+
62. | x    |
63. +------+
64. |    3 |
65. +------+
66. 1 row in set (0.00 sec)

68. +------+
69. | x    |
70. +------+
71. |    2 |
72. +------+
73. 1 row in set (0.00 sec)

75. Query OK, 0 rows affected (0.00 sec)
    1. 示例3
1. greatsql> SET sql_mode = ORACLE;
2. greatsql> DELIMITER //

4. greatsql> CREATE OR REPLACE PROCEDURE p1(i FLOAT, j FLOAT) AS
5. val FLOAT := 1.2;
6. BEGIN
7. FOR x IN i .. j LOOP
8. -- 循环内部再加上一个 FLOAT 类型值
9. val := val + x;
10. SELECT val;
11. END LOOP;
12. END; //

14. greatsql> CALL p1(1.5, 3.4) //
15. +------+
16. | val  |
17. +------+
18. |  3.2 |
19. +------+
20. 1 row in set (0.00 sec)

22. +------+
23. | val  |
24. +------+
25. |  6.2 |
26. +------+
27. 1 row in set (0.00 sec)

29. Query OK, 0 rows affected (0.00 sec)

31. greatsql> CALL p1(1.4, 3.5) //
32. +------+
33. | val  |
34. +------+
35. |  2.2 |
36. +------+
37. 1 row in set (0.00 sec)

39. +------+
40. | val  |
41. +------+
42. |  4.2 |
43. +------+
44. 1 row in set (0.00 sec)

46. +------+
47. | val  |
48. +------+
49. |  7.2 |
50. +------+
51. 1 row in set (0.01 sec)

53. +------+
54. | val  |
55. +------+
56. | 11.2 |
57. +------+
58. 1 row in set (0.01 sec)

60. Query OK, 0 rows affected (0.01 sec)

62. greatsql> CALL p1(1.5, 3.4) //
63. +------+
64. | val  |
65. +------+
66. |  3.2 |
67. +------+
68. 1 row in set (0.00 sec)

70. +------+
71. | val  |
72. +------+
73. |  6.2 |
74. +------+
75. 1 row in set (0.00 sec)

77. Query OK, 0 rows affected (0.00 sec)

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx