存储过程 RETURN语句
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语句的更多相关文章
- PostgreSQL存储过程(4)-return语句
1. return语句 有三个命令可以用来从函数中返回数据: RETURN RETURN NEXT RETURN QUERY 2. RETURN命令 语法: RETURN RETURN express ...
- SQL Server存储过程Return、output参数及使用技巧
SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...
- 基于ORACLE建表和循环回路来创建数据库存储过程SQL语句来实现
一个.概要 在实际的软件开发项目.我们经常会遇到需要创造更多的相同类型的数据库表或存储过程时,.例如.假设按照尾号点表的ID号,然后,你需要创建10用户信息表,的用户信息放在同一个表中. 对于类型同样 ...
- 高程(3):操作符、for、for...in循环、break/continue/return语句、函数等
1.关系操作符 注意点:1)比较操作数是两个字符串,是比较字符串的字符编码值. 如:"a" > "b" 返回 false:"a" & ...
- 【转】Java中try catch finally语句中含有return语句的执行情况(总结版)
Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有r ...
- 0016 Java学习笔记-异常-如果try-catch-finally中都存在return语句会怎样?
上午在搜索"System.runFinalization"的时候,搜到 http://www.cnblogs.com/Skyar/p/5962253.html ,其中有关于try- ...
- javascript简单的认识下return语句+2015的总结+2016的展望
好久没更新博客了...自从有了mac之后世界变得简单了...日常么,除了研究代码,看别人的代码,写自己的代码.就那样.... 吐槽点:window配个nodejs的环境花了九头牛两只老虎的力气,mac ...
- 有return语句情况下,try-catch-finally的执行顺序
重要结论: 1.不管有没有出现异常,finally块中代码都会执行 2.当try和catch中有return时,finally仍然会执行 3.finally是在return后面的表达式运算后执行的(此 ...
- try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,还是在return之后执行?
这是一个很有趣的问题,我测试的结果是:是在return中间执行. 我在网上搜寻了一些资料,下面是参考代码: /** * */ package com.b510.test; /** * try {}里有 ...
- java finally中含return语句
<java核心技术卷一>中提到过:当finally子句包含return 语句时(当然在设计原则上是不允许在finally块中抛出异常或者 执行return语句的,我不明白为何java的设计 ...
随机推荐
- 【OpenGL ES】第一个案例
1 前言 OpenGL(Open Graphics Library)是由 SGI 公司开发的一套 3D 图形软件接口标准,由于具有体系结构简单合理.使用方便.与操作平台无关等优点,OpenGL 迅 ...
- rsyslog 系统日志收集上报(可增加自定义项目日志)
Linux 自带应用,没有复杂的依赖关系却有强大的日志采集上报功能 本文以上报阿里云为例 1.基础配置讲解 /etc/rsyslog.conf 为其主配置文件(不用动) /etc/rsyslog.d/ ...
- 从 vs 的 rc 文件中获取版本号
更新项目版本号时,需要与 rc 文件的 version 同步,比较方便的方法是直接从 rc 文件中获取版本号,并应用到程序中 // 删除日志检查 bool GetVersion() { // get ...
- 一个自定义可扩展的检测变量的函数typeofIt();
自定义方法typeofIt()是用来判断传入的变量或属性是什么类型的; 1.如果是基础类型变量则返回代表基础变量类型小写格式的字符串及一些简易说明; 2.如果是对象类型变量则返回结尾带有"O ...
- FFmpeg开发笔记(十一):ffmpeg在移植到海思HI35xx平台之将ffmpeg库引入到sample的demo中
前言 上一篇交叉编译了ffmpeg的海思版本,使用交叉编译的qt的ffmpeg播放器在海思上播放,本片是将ffmpeg的环境添加进海思的sample环境中. 在海思sample中引入ffmpe ...
- django学习第十天---ajax请求和JsonResponse
AJAX 它是js的功能,特点:异步请求,局部刷新 简单请求示例 基于jquery的ajax请求 异步请求,不会刷新页面,页面上用户之前输入的数据都不会丢失 <p>下面是ajax请求< ...
- VMware虚拟机Ubuntu系统连接网络过程
网络和Internet设置--高级网络设置--更多网络适配器选项--WLAN. 右键选择属性--共享,勾选允许连接,选择VMnet8.(若勾选了其它,之后再想换回来,可以先取消勾选,点确定,再进入勾选 ...
- ThreadLocal原理解析
ThreadLocal源码分析 /* * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * ...
- DataGear 制作折柱图数据可视化图表
利用 DataGear 看板的 自定义图表选项 功能,可以很方便地制作折柱图(或者折线-饼图.柱状-饼图)数据可视化图表. 假设有如下CSV数据集,包括名称和两个指标值数据: 名称, 指标0, 指标 ...
- CentOS系统下,配制nginx代理
1.安装: yum install nginx 2.证书文件位置: a. 创建https证书文件夹:/etc/nginx/ssl b. 上传两个证书文件到/etc/nginx/ssl 3.在/etc/ ...