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 用法。该用法如下所述:
- 不需要事先声明
FOR LOOP中的变量var,直接使用FOR var IN expr1 .. expr2 LOOP语法即可。 - 支持增加
REVERSE关键字,可以实现倒序获取数据目的。 - 循环中的
expr1/expr2支持数值类型变量、数值、函数以及表达式等。expr1/expr2如果是FLOAT类型则会被转换成INT型(转换时会做四舍五入处理)。 - 如果
expr1/expr2是时间类型,则会被转换为数值类型进行计算,而不是按照时间规则进行加减计算。在Oracle中不支持该类型,会产生报错。 - 在循环
FOR var IN中的变量var如果是FLOAT类型则会被转换成INT型(转换时会做四舍五入处理)。
4. 示例
-
- 示例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 型(转换时会做四舍五入处理)。
-
- 示例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)
-
- 示例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)
问题反馈
联系我们
扫码关注微信公众号

