FOR
Циклы FOR были введены в MariaDB 10.3.
Синтаксис
Цикл FOR с диапазоном целых чисел:
[begin_label:] FOR var_name IN [ REVERSE ] lower_bound .. upper_bound DO statement_list END FOR [ end_label ]
Цикл FOR с явным курсором
[begin_label:] FOR record_name IN cursor_name [ ( cursor_actual_parameter_list)] DO statement_list END FOR [ end_label ]
Цикл FOR с явным курсором (режим Oracle)
[begin_label:] FOR record_name IN cursor_name [ ( cursor_actual_parameter_list)] LOOP statement_list END LOOP [ end_label ]
Цикл FOR с неявным курсором
[begin_label:] FOR record_name IN ( select_statement ) DO statement_list END FOR [ end_label ]
Описание
Циклы FOR позволяют выполнять код определенное количество раз.
В цикле FOR с диапазоном целых чисел MariaDB сравнивает нижнюю и верхнюю границы и присваивает нижнюю границу счетчику. Если REVERSE не указано, и значение верхней границы больше или равно значению счетчика, счетчик увеличивается, и оператор продолжает выполняться, после чего цикл повторяется. Если значение верхней границы больше значения счетчика, цикл завершается.
Если REVERSE указано, счетчик уменьшается, а значение верхней границы должно быть меньше или равно для продолжения цикла.
Примеры
Цикл FOR с диапазоном целых чисел:
CREATE TABLE t1 (a INT); DELIMITER // FOR i IN 1..3 DO INSERT INTO t1 VALUES (i); END FOR; // DELIMITER ; SELECT * FROM t1; +------+ | a | +------+ | 1 | | 2 | | 3 | +------+
Цикл FOR с диапазоном целых чисел (REVERSE):
CREATE OR REPLACE TABLE t1 (a INT);
DELIMITER //
FOR i IN REVERSE 4..12
DO
INSERT INTO t1 VALUES (i);
END FOR;
//
Query OK, 9 rows affected (0.422 sec)
DELIMITER ;
SELECT * FROM t1;
+------+
| a |
+------+
| 12 |
| 11 |
| 10 |
| 9 |
| 8 |
| 7 |
| 6 |
| 5 |
| 4 |
+------+
Явный курсор в режиме Oracle:
SET sql_mode=ORACLE;
CREATE OR REPLACE TABLE t1 (a INT, b VARCHAR(32));
INSERT INTO t1 VALUES (10,'b0');
INSERT INTO t1 VALUES (11,'b1');
INSERT INTO t1 VALUES (12,'b2');
DELIMITER //
CREATE OR REPLACE PROCEDURE p1(pa INT) AS
CURSOR cur(va INT) IS
SELECT a, b FROM t1 WHERE a=va;
BEGIN
FOR rec IN cur(pa)
LOOP
SELECT rec.a, rec.b;
END LOOP;
END;
//
DELIMITER ;
CALL p1(10);
+-------+-------+
| rec.a | rec.b |
+-------+-------+
| 10 | b0 |
+-------+-------+
CALL p1(11);
+-------+-------+
| rec.a | rec.b |
+-------+-------+
| 11 | b1 |
+-------+-------+
CALL p1(12);
+-------+-------+
| rec.a | rec.b |
+-------+-------+
| 12 | b2 |
+-------+-------+
CALL p1(13);
Query OK, 0 rows affected (0.000 sec)
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/for/