ITPub博客

首页 > 数据库 > > 控制语句-循环语句

控制语句-循环语句

作者:GaussDB_数据库 时间:2020-01-16 15:42:03 0 删除 编辑

简单LOOP语句

语法图

图1 loop::=
GaussDB loop::=

示例

CREATE OR REPLACE PROCEDURE proc_loop(i in integer, count out integer) 
AS
BEGIN
count:=;
LOOP
IF count > i THEN
raise info 'count is %. ', count;
EXIT;
ELSE
count:=count+1;
END IF;
END LOOP;
END;
/
CALL proc_loop(10,5);

该循环必须要结合EXIT使用,否则将陷入死循环。

WHILE_LOOP语句

语法图

图2 while_loop::=
GaussDB while_loop::=

只要条件表达式为真,WHILE语句就会不停的在一系列语句上进行循环,在每次进入循环体的时候进行条件判断。

示例

CREATE TABLE integertable(c1 integer) DISTRIBUTE BY hash(c1); 
CREATE OR REPLACE PROCEDURE proc_while_loop(maxval in integer)
AS
DECLARE
i int :=1;
BEGIN
WHILE i < maxval LOOP
INSERT INTO integertable VALUES(i);
i:=i+1;
END LOOP;
END;
/
--调用函数 CALL proc_while_loop(10); --删除存储过程和表 DROP PROCEDURE proc_while_loop; DROP TABLE integertable;

FOR_LOOP(integer变量)语句

语法图

图3 for_loop::=
GaussDB for_loop::=
 说明:
  • 变量name会自动定义为integer类型并且只在此循环里存在。变量name介于lower_bound和upper_bound之间。
  • 当使用REVERSE关键字时,lower_bound必须大于等于upper_bound,否则循环体不会被执行。

示例

--从到5进行循环
CREATE OR REPLACE PROCEDURE proc_for_loop()
AS
BEGIN
FOR I IN ..5 LOOP
DBMS_OUTPUT.PUT_LINE('It is '||to_char(I) || ' time;') ;
END LOOP;
END;
/
--调用函数
CALL proc_for_loop();
--删除存储过程
DROP PROCEDURE proc_for_loop;

FOR_LOOP查询语句

语法图

图4 for_loop_query::=
GaussDB for_loop_query::=
 说明:

变量target会自动定义,类型和query的查询结果的类型一致,并且只在此循环中有效。target的取值就是query的查询结果。

示例

--循环输出查询结果。
CREATE OR REPLACE PROCEDURE proc_for_loop_query()
AS
record VARCHAR2(50);
BEGIN
FOR record IN SELECT spcname FROM pg_tablespace LOOP
dbms_output.put_line(record);
END LOOP;
END;
/
--调用函数
CALL proc_for_loop_query();
--删除存储过程
DROP PROCEDURE proc_for_loop_query;

FORALL批量查询语句

语法图

图5 forall::=
GaussDB forall::=
 说明:

变量index会自动定义为integer类型并且只在此循环里存在。index的取值介于low_bound和upper_bound之间。

示例

CREATE TABLE hdfs_t1 (
title NUMBER(6),
did VARCHAR2(20),
data_peroid VARCHAR2(25),
kind VARCHAR2(25),
interval VARCHAR2(20),
time DATE,
isModified VARCHAR2(10)
)
DISTRIBUTE BY hash(did);
INSERT INTO hdfs_t1 VALUES( 8, 'Donald', 'OConnell', 'DOCONNEL', '650.507.9833', to_date('21-06-1999', 'dd-mm-yyyy'), 'SH_CLERK' );
CREATE OR REPLACE PROCEDURE proc_forall()
AS
BEGIN
FORALL i IN 100..120
update hdfs_t1 set title = title + 100*i;
END;
/
--调用函数
CALL proc_forall();
--查询存储过程调用结果
SELECT * FROM hdfs_t1 WHERE title BETWEEN 100 AND 120;
--删除存储过程和表
DROP PROCEDURE proc_forall;
DROP TABLE hdfs_t1;


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3154770/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-01-06

  • 博文量
    2907
  • 访问量
    19248