diff --git "a/content/zh/post/z-qw/openGauss-\345\276\252\347\216\257\350\257\255\345\217\245.md" "b/content/zh/post/z-qw/openGauss-\345\276\252\347\216\257\350\257\255\345\217\245.md" index cf4835a83e7dddd20d977e9d6b9d5e8ba4b965a4..14c675c5605e2d96662eb3f67acc4e606347b461 100644 --- "a/content/zh/post/z-qw/openGauss-\345\276\252\347\216\257\350\257\255\345\217\245.md" +++ "b/content/zh/post/z-qw/openGauss-\345\276\252\347\216\257\350\257\255\345\217\245.md" @@ -12,20 +12,171 @@ author = "z-qw" summary = "openGauss社区开发入门" -img = "" +img = "/zh/post/z-qw/title-loop/title.jpg" times = "17:30" +++ ## LOOP语句 -1.与label标签名连用,可使用continue或者iterate + label标签名跳出本次循环,重新开始下一次循环;可使用exit/leave + label标签名 退出循环
创建循环,使用iterate + label标签名跳出本次循环;leave + label标签名 退出循环
CREATE OR REPLACE PROCEDURE prc_loop(i in integer, count out integer)
AS
BEGIN
count:=0;
label1:
LOOP
IF count > i THEN
raise info 'count is %. ', count;
LEAVE label1;
ELSE
count:=count+1;
END IF;
IF count < 7 THEN
ITERATE label1;
ELSE
raise info 'greater than 7';
END IF;
END LOOP label1;
END;
/
调用存储过程
CALL prc_loop(10,5);
显示信息
INFO: greater than 7
INFO: greater than 7
INFO: greater than 7
INFO: greater than 7
INFO: greater than 7
INFO: count is 11.
count
11
(1 row) +1.与label标签名连用,可使用continue或者iterate + label标签名跳出本次循环,重新开始下一次循环;可使用exit/leave + label标签名 退出循环 +``` +CREATE OR REPLACE PROCEDURE prc_loop(i in integer, count out integer) +AS +BEGIN +count:=0; +label1: +LOOP + IF count > i THEN +raise info 'count is %. ', count; +LEAVE label1; +ELSE +count:=count+1; +END IF; +IF count < 7 THEN +ITERATE label1; +ELSE +raise info 'greater than 7'; +END IF; +END LOOP label1; +END; +/ +``` +``` +CALL prc_loop(10,5); +``` +``` +INFO: greater than 7 +INFO: greater than 7 +INFO: greater than 7 +INFO: greater than 7 +INFO: greater than 7 +INFO: count is 11. +count +----- +11 +(1 row) +``` -2.可用于存储过程带有自治事务、自定义函数、游标、触发器等环境中
举例:创建自定义函数
CREATE FUNCTION func_loop(a int,b int,i int) return int
AS
BEGIN
LOOP
i=i-1;
IF i>4 then
CONTINUE;
END IF;
a=a+b;
IF i<2 then
EXIT;
END IF;
END LOOP;
RETURN a;
END;
/
--2.调用函数
CALL func_loop(1,2,7);
--显示信息
func_loop
9
(1 row) +2.可用于存储过程带有自治事务、自定义函数、游标、触发器等环境中
举例: +``` +CREATE FUNCTION func_loop(a int,b int,i int) return int +AS + BEGIN + LOOP + i=i-1; + IF i>4 then + CONTINUE; + END IF; + a=a+b; + IF i<2 then + EXIT; + END IF; + END LOOP; + RETURN a; + END; +/ +``` +``` +CALL func_loop(1,2,7); +``` +``` +func_loop +-------- +9 +(1 row) +``` ## WHILE_LOOP 语句 -在每次循环开始判断,若为真值,继续循环,反之,退出循环。
举例:
CREATE OR REPLACE PROCEDURE proc_while_loop(a int,b out int)
AS
DECLARE
i int :=1;
BEGIN
WHILE i raise info '循环%次. ', i;
i:=i+1;
END LOOP;
raise info 'i is %. ', i;
b=i;
END;
/
调用函数
CALL proc_while_loop(5,6);
显示信息
INFO: 循环1次.
INFO: 循环2次.
INFO: 循环3次.
INFO: 循环4次.
INFO: i is 5.
b
5
(1 row) +在每次循环开始判断,若为真值,继续循环,反之,退出循环。
举例: +``` +CREATE OR REPLACE PROCEDURE proc_while_loop(a int,b out int) +AS +DECLARE +i int :=1; +BEGIN +WHILE i
=min.
举例:从5到10进行循环
CREATE OR REPLACE PROCEDURE proc_for_loop(sum out int)
AS
BEGIN
sum:=0;
FOR a IN 5..15 LOOP
sum=a+sum;
raise info '循环%次,和为%.', a-4,sum;
END LOOP;
END;
/
调用函数
CALL proc_for_loop();
显示信息
INFO: 循环1次,和为5.
INFO: 循环2次,和为11.
INFO: 循环3次,和为18.
INFO: 循环4次,和为26.
INFO: 循环5次,和为35.
INFO: 循环6次,和为45.
INFO: 循环7次,和为56.
INFO: 循环8次,和为68.
INFO: 循环9次,和为81.
INFO: 循环10次,和为95.
INFO: 循环11次,和为110.
sum
110
(1 row) +变量指定起始位置min,遍历到达指定终点位置max,其中max>=min.
举例: +``` +CREATE OR REPLACE PROCEDURE proc_for_loop(sum out int) +AS +BEGIN +sum:=0; +FOR a IN 5..15 LOOP +sum=a+sum; +raise info '循环%次,和为%.', a-4,sum; +END LOOP; +END; +/ +``` +``` +CALL proc_for_loop(); +``` +``` +INFO: 循环1次,和为5. +INFO: 循环2次,和为11. +INFO: 循环3次,和为18. +INFO: 循环4次,和为26. +INFO: 循环5次,和为35. +INFO: 循环6次,和为45. +INFO: 循环7次,和为56. +INFO: 循环8次,和为68. +INFO: 循环9次,和为81. +INFO: 循环10次,和为95. +INFO: 循环11次,和为110. +sum +--- +110 +(1 row) +``` ### 2.查询语句变量 -变量会自动定义,类型和查询结果的类型一致,并且只在此循环中有效。target的取值就是查询结果。
创建查询表
CREATE TABLE tb_select(id int,name text);
INSERT INTO tb_select VALUES(1,'lili'),(2,'kiko'),(3,'MING');
CREATE OR REPLACE PROCEDURE proc_for_loop_query(count out int)
AS
record text;
BEGIN
count=0;
FOR record IN SELECT name FROM tb_select LOOP
count=count+1;
raise info '名字是%.',record;
END LOOP;
END;
/
调用函数
CALL proc_for_loop_query(9);
显示信息
INFO: 名字是lili.
INFO: 名字是kiko.
INFO: 名字是MING.
count
3
(1 row) - +变量会自动定义,类型和查询结果的类型一致,并且只在此循环中有效。target的取值就是查询结果。 +``` +CREATE TABLE tb_select(id int,name text); +INSERT INTO tb_select VALUES(1,'lili'),(2,'kiko'),(3,'MING'); +CREATE OR REPLACE PROCEDURE proc_for_loop_query(count out int) +AS +record text; +BEGIN +count=0; +FOR record IN SELECT name FROM tb_select LOOP +count=count+1; +raise info '名字是%.',record; +END LOOP; +END; +/ +``` +``` +CALL proc_for_loop_query(9); +``` +``` +INFO: 名字是lili. +INFO: 名字是kiko. +INFO: 名字是MING. +count +----- +3 +(1 row) +``` diff --git a/content/zh/post/z-qw/title-loop/title.jpg b/content/zh/post/z-qw/title-loop/title.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86a420b92fb8289658d807d49f137b6d13862f6d Binary files /dev/null and b/content/zh/post/z-qw/title-loop/title.jpg differ