1. return语句

有三个命令可以用来从函数中返回数据:

  • RETURN
  • RETURN NEXT
  • RETURN QUERY

2. RETURN命令

语法:

RETURN
RETURN expression;

如果没有使用表达式 RETURN命令用于告诉这个函数已经完成执行了。
如果返回标量类型,那么可以使用任何表达式.要返回一个复合(行)数值,你必须写一个记录或者行变量的expression。

2.1 案例1:带有表达式return案例

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

如果你声明函数带输出参数,那么就只需要写无表达式的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;

2.2 案例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;

3. RETURN NEXT命令

语法:

RETURN NEXT expression;

3.1 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;

4. RETURN QUERY命令

语法:

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

4.1 RETURN QUERY命令

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

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;

4.2 RETURN QUERY EXECUTE命令

是执行动态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;

PostgreSQL存储过程(4)-return语句的更多相关文章

  1. Mybatis调用PostgreSQL存储过程实现数组入参传递

    注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于Pos ...

  2. 调用PostgreSQL存储过程,找不到函数名的问题

    PostgreSQL的表,函数名称都是严格区分大小写的,所以在使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定义的数据类型,也会发生这个问题. 问题描 ...

  3. PostgreSQL存储过程(3)-流程控制语句

    流程控制 讲解条件语句,循环语句. 本次环境会用到表emp:下面是emp执行语句. drop table emp; create table EMP( EMPNO numeric() not null ...

  4. C#存储过程中return参数

    //1 连接字符串 string connectionString = "server=127.0.0.1;integrated security=true;database=MSPetSh ...

  5. EF增删查改加执行存储过程和sql语句,多种方法汇总

    ActionUrl c = new ActionUrl() { ActionName="test", RequestUrl="/123/123", SubTim ...

  6. 关于ExecuteNonQuery执行存储过程的返回值 、、实例讲解存储过程的返回值与传出参数、、、C#获取存储过程的 Return返回值和Output输出参数值

    关于ExecuteNonQuery执行存储过程的返回值 用到过ExecuteNonQuery()函数的朋友们在开发的时候肯定这么用过. if(cmd.ExecuteNonQuery("xxx ...

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

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

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

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

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

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

随机推荐

  1. Matlab函数——std,std2与mean,mean2区别

    最近看代码,经常看到std,std2的用法,由于刚刚学习,网上搜索了下,没有找到解答,看了help,s = std(X,flag)s = std(X,flag,dim)  ,只告诉我们 flag,di ...

  2. Windows Server 2012 任务管理器“性能”Tab页显示磁盘信息

    最新文章:Virson's Blog Win+x,以管理员身份运行“命令提示符”(Cmd),输入diskperf -y,确定即可,如下图.

  3. Mac使用git/github小结

    介绍 git 版本控制系统 相比CVS\SVN优势: - 支持离线开发,离线Repository- 强大的分支功能,适合多个独立开发者协作- 速度快 2. github是一个git项目托管网站 注册地 ...

  4. 年中总结大会--总结学习笔记, 技术部IT部门年中总结报告该怎么写

    组织年中总结大会该如何组织 1. 通知每一位员工, 总结自己的半年工作(提前多少天, 截至日期) 2. 会场布置 3. 部门领导总结 4. 中场休息, 或节目表演, 合影等 5. 表彰 6. 交流(提 ...

  5. 【Python】Python加lxml实现图片解析下载功能

    1.下载网页:OpenHtml.py import urllib.request from urllib.parse import quote class HtmlLoader(object): de ...

  6. Java如何暂停线程一段时间?

    在Java编程中,如何暂停线程一段时间? 以下示例显示如何通过创建sleepThread()方法来暂停线程一段时间. package com.yiibai; public class Suspendi ...

  7. mysql limit分页查询效率

    对于有大数据量的mysql表来说,使用LIMIT分页存在很严重的性能问题. 查询从第1000000之后的30条记录: SQL代码1:平均用时6.6秒 SELECT * FROM `cdb_posts` ...

  8. MySQL 数据库定时自动备份

    创建备份目录 cd /home mkdir backup cd backup 创建备份 Shell 脚本: vim DatabaseName.sh #!/bin/bash /usr/local/mys ...

  9. winform 用户控件事件的写法

    public partial class UcTest : UserControl { public UcTest() { InitializeComponent(); } //定义事件 public ...

  10. max导出模型插件

    首先,需要做好如下的准备工作:1. 安装一个完整版本的3D MAX与Visual Stdio.我安装的是3D MAX 2012,最好是找一个完整的版本,因为完整的版本中有很多的学习资料与sdk供学习, ...