
# 返回语句
DWS提供两种方式返回数据：RETURN（或RETURN NEXT）及RETURN QUERY。其中，RETURN NEXT和RETURN QUERY只适用于函数，不适用存储过程。
#### RETURN
**语法**
返回语句的语法请参见[图1]。
图1return_clause::=   
![](https://support.huaweicloud.com/devg-dws/figure/zh-cn_image_0000002076373741.jpg "点击放大")
对以上语法的解释如下：
用于将控制从存储过程或函数返回给调用者。
**示例**
```
--创建存储过程proc_staffs
CREATE OR REPLACE PROCEDURE proc_staffs
(
section     NUMBER(6),
salary_sum out NUMBER(8,2),
staffs_count out INTEGER
)
IS
BEGIN
SELECT sum(salary), count(*) INTO salary_sum, staffs_count FROM staffs where section_id = section;
END;
/
--创建存储过程proc_return.
CREATE OR REPLACE PROCEDURE proc_return
AS
v_num NUMBER(8,2);
v_sum INTEGER;
BEGIN
proc_staffs(30, v_sum, v_num);  --调用语句
dbms_output.put_line(v_sum||'#'||v_num);
RETURN;  --返回语句
END;
/
--调用存储过程proc_return.
CALL proc_return();
--清除存储过程
DROP PROCEDURE proc_staffs;
DROP PROCEDURE proc_return;
--创建函数func_return.
CREATE OR REPLACE FUNCTION func_return returns void
language plpgsql
AS $$
DECLARE
v_num INTEGER := 1;
BEGIN
dbms_output.put_line(v_num);
RETURN;  --返回语句
END $$;
-- 调用函数func_return
CALL func_return();
1
-- 清除函数
DROP FUNCTION func_return;
```
#### RETURN NEXT及RETURN QUERY
**语法**
创建函数时需要指定返回值SETOF datatype。
return_next_clause::=
![](https://support.huaweicloud.com/devg-dws/figure/zh-cn_image_0000002040176034.png "点击放大")
return_query_clause::=
![](https://support.huaweicloud.com/devg-dws/figure/zh-cn_image_0000002076335169.png "点击放大")
对以上语法的解释如下：
当需要函数返回一个集合时，使用RETURN NEXT或者RETURN QUERY向结果集追加结果，然后继续执行函数的下一条语句。随着后续的RETURN NEXT或RETURN QUERY命令的执行，结果集中会有多个结果。函数执行完成后会一起返回所有结果。
RETURN NEXT可用于标量和复合数据类型。
RETURN QUERY有一种变体RETURN QUERY EXECUTE，后面还可以增加动态查询，通过USING向查询插入参数。
**示例**
```
CREATE TABLE t1(a int);
INSERT INTO t1 VALUES(1),(10);
--RETURN NEXT
CREATE OR REPLACE FUNCTION fun_for_return_next() RETURNS SETOF t1 AS $$
DECLARE
   r t1%ROWTYPE;
BEGIN
   FOR r IN select * from t1
   LOOP
      RETURN NEXT r;
   END LOOP;
   RETURN;
END;
$$ LANGUAGE PLPGSQL;
call fun_for_return_next();
 a
---
 1
 10
(2 rows)
-- RETURN QUERY
CREATE OR REPLACE FUNCTION fun_for_return_query() RETURNS SETOF t1 AS $$
DECLARE
   r t1%ROWTYPE;
BEGIN
   RETURN QUERY select * from t1;
END;
$$
language plpgsql;
call fun_for_return_next();
 a
---
 1
 10
(2 rows)
```
