1、RETURN

如果没有使用表达式,RETURN 命令用于告诉这个函数已经完成执行了,如示例2.

如果返回标量类型,那么可以使用任何表达式。

示例1: 带有表达式return

CREATE OR REPLACE FUNCTION getCompFoo1(in_col1 int, in_col2 TEXT)
RETURNS compfoo
AS $$
DECLARE
comp compfoo;
BEGIN
comp.f1 := in_col1 + 1;
comp.f2 := in_col2 || '_result';
RETURN comp;
END;
$$ LANGUAGE PLPGSQL;

compfoo 为自定义类型:CREATE TYPE compfoo AS (f1 int, f2 text);

函数返回结果:

test=# select getCompFoo1(1,'a');
getcompfoo1
--------------
(2,a_result)
(1 row)

如果声明函数带输出参数,那么就只需要写无表达式的RETURN。那么输出参数变量的当前值将被返回。

CREATE OR REPLACE FUNCTION getCompFoo2 (in_col1 IN int,in_col2 IN TEXT, out_col1 OUT int, out_col2 OUT TEXT)
AS $$
BEGIN
out_col1 := in_col1 + 1;
out_col2 := in_col2 || '_result';
END;
$$ LANGUAGE PLPGSQL;

函数返回结果:

test=# select getCompFoo2(1,'a');
getcompfoo2
--------------
(2,a_result)
(1 row)

示例2:不带有表达式return

如果声明函数返回void,那么一个RETURN语句可以用于提前退出函数; 但是不要在RETURN后面写一个表达式。

CREATE OR REPLACE FUNCTION getreturn(in_col1 int)
RETURNS void
AS $$
BEGIN
if in_col1 > 0 then
RAISE NOTICE 'there is %',in_col1;
else
return;
end if;
END;
$$ LANGUAGE PLPGSQL;

函数返回结果:

test=# select getreturn(1);
NOTICE: there is 1
getreturn
----------- (1 row) test=# select getreturn(0);
getreturn
----------- (1 row)

2、RETURN NEXT

可以用于标量和复合数据类型;对于复合类型,将返回一个完整的结果"table"。

示例:

CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT);
INSERT INTO foo VALUES (1, 2, 'three');
INSERT INTO foo VALUES (4, 5, 'six'); CREATE OR REPLACE FUNCTION getAllFoo() RETURNS SETOF foo AS
$$
DECLARE
r foo%rowtype;
BEGIN
FOR r IN SELECT * FROM foo WHERE fooid > 0
LOOP
-- can do some processing here
RETURN NEXT r; -- return current row of SELECT
END LOOP;
RETURN;
END
$$ LANGUAGE PLPGSQL;

返回结果:

test=# select getAllFoo();
getallfoo
-------------
(1,2,three)
(4,5,six)
(2 rows)

3、RETURN QUERY

语法:

RETURN QUERY query;

RETURN QUERY EXECUTE command-string [ USING expression [, ... ] ];

示例1:将一条查询的结果追加到一个函数的结果集中。

CREATE OR REPLACE FUNCTION getAllFoo2() RETURNS SETOF foo AS
$$
DECLARE
r foo%rowtype;
BEGIN
RETURN QUERY SELECT * FROM foo WHERE fooid > 0;
END
$$ LANGUAGE PLPGSQL;

返回结果:

test=# select getAllFoo2();
getallfoo2
-------------
(1,2,three)
(4,5,six)
(2 rows)

示例2:执行动态SQL。

CREATE OR REPLACE FUNCTION getAllFoo3(filter numeric) RETURNS SETOF foo AS
$$
BEGIN
RETURN QUERY EXECUTE 'SELECT * FROM foo WHERE fooid > $1' USING filter;
END
$$ LANGUAGE PLPGSQL;

执行结果:

test=# select getAllFoo3(1);
getallfoo3
------------
(4,5,six)
(1 row)

  

存储过程 RETURN语句的更多相关文章

  1. PostgreSQL存储过程(4)-return语句

    1. return语句 有三个命令可以用来从函数中返回数据: RETURN RETURN NEXT RETURN QUERY 2. RETURN命令 语法: RETURN RETURN express ...

  2. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  3. 基于ORACLE建表和循环回路来创建数据库存储过程SQL语句来实现

    一个.概要 在实际的软件开发项目.我们经常会遇到需要创造更多的相同类型的数据库表或存储过程时,.例如.假设按照尾号点表的ID号,然后,你需要创建10用户信息表,的用户信息放在同一个表中. 对于类型同样 ...

  4. 高程(3):操作符、for、for...in循环、break/continue/return语句、函数等

    1.关系操作符 注意点:1)比较操作数是两个字符串,是比较字符串的字符编码值. 如:"a" > "b"  返回 false:"a" & ...

  5. 【转】Java中try catch finally语句中含有return语句的执行情况(总结版)

    Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有r ...

  6. 0016 Java学习笔记-异常-如果try-catch-finally中都存在return语句会怎样?

    上午在搜索"System.runFinalization"的时候,搜到 http://www.cnblogs.com/Skyar/p/5962253.html ,其中有关于try- ...

  7. javascript简单的认识下return语句+2015的总结+2016的展望

    好久没更新博客了...自从有了mac之后世界变得简单了...日常么,除了研究代码,看别人的代码,写自己的代码.就那样.... 吐槽点:window配个nodejs的环境花了九头牛两只老虎的力气,mac ...

  8. 有return语句情况下,try-catch-finally的执行顺序

    重要结论: 1.不管有没有出现异常,finally块中代码都会执行 2.当try和catch中有return时,finally仍然会执行 3.finally是在return后面的表达式运算后执行的(此 ...

  9. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,还是在return之后执行?

    这是一个很有趣的问题,我测试的结果是:是在return中间执行. 我在网上搜寻了一些资料,下面是参考代码: /** * */ package com.b510.test; /** * try {}里有 ...

  10. java finally中含return语句

    <java核心技术卷一>中提到过:当finally子句包含return 语句时(当然在设计原则上是不允许在finally块中抛出异常或者 执行return语句的,我不明白为何java的设计 ...

随机推荐

  1. 【framework】TaskStack简介

    1 前言 ​ TaskStack 用于管理 app,一般一个应用程序对应一个 TaskStack,其父容器为 TaskStackContainers(DisplayContent 的子容器),子容器为 ...

  2. Java Socket编程系列(四)开发支持多客户端访问的Server

    例子来自Java官方教程,稍作调整. 上一篇介绍了单客户端访问的Server实现,这一篇实现的是多个客户端请求服务端,根据服务端提示进行一系列操作. 协议类(和系列三一样没变): package co ...

  3. win32-如何识别哪个静态控件被点击

    创建多个具体SS_NOTIFY样式的static controls 根据文档显示,当用户单击具有SS_NOTIFY样式的静态控件时,将发送STN_CLICKED通知代码.控件的父窗口通过WM_COMM ...

  4. Ubuntu防火墙相关

    查看防火墙当前状态 sudo ufw status 开启防火墙 sudo ufw enable 关闭防火墙 sudo ufw disable 查看防火墙版本 sudo ufw version 默认允许 ...

  5. ASP.NET Core MVC应用模型的构建[3]: Controller的收集

    从编程的角度来看,一个MVC应用是由一系列Controller类型构建而成的,所以对于一个代表应用模型的ApplicationModel对象来说,它的核心就是Controllers属性返回的一组Con ...

  6. centos docker服务问题

    概述 docker的应用版本正式上线,结果一上线就出各种幺蛾子. 本文档主要介绍centos系统安装docker和启动的问题解决方法. 环境 docker registry:2 centos 6 &a ...

  7. 在ABP的模块解决方案中使用BootstrapBlazor

    1.为Study.Trade.Blazor.Server.Host引入两个包 成功后效果如下: 2.修改Study.Trade.Blazor.Server.Host的Pages目录下的_Host.cs ...

  8. 【Azure 存储服务】Azure Storage Account Queue中因数据格式无法处理而在一个小时内不在可见的问题

    问题描述 在从Storage Account 队列中获取数据(Queue),在门户中,明显看见有数据,但是通过消费端代码去获取的时候,就是无法获取到有效数据的情况.获取消息的代码如下: 问题解答 经过 ...

  9. C++ //提高编程 模板(泛型编程 STL) //模板不可以直接使用 它只是一个框架 //模板的通用并不是万能的 //语法 //template<typename T> //函数模板两种方式 //1.自动类型推导 必须推导出一致的数据类型T,才可以使用 //2.显示指定类型 模板必须确定出T的数据类型,才可以使用

    1 //C++提高编程 模板(泛型编程 STL) 2 //模板不可以直接使用 它只是一个框架 3 //模板的通用并不是万能的 4 //语法 5 //template<typename T> ...

  10. 使用 Abp.Zero 搭建第三方登录模块(二):服务端开发

    ​ 微信SDK库的集成 微信SDK库是针对微信相关 API 进行封装的模块 ,目前开源社区中微信SDK库数量真是太多了,我选了一个比较好用的EasyAbp WeChat库. EasyAbp/Abp.W ...