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

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;
时间: 2024-11-08 19:57:06

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

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

PostgreSQL的表,函数名称都是严格区分大小写的,所以在使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定义的数据类型,也会发生这个问题. 问题描述: 下面的示例测试代码: PWMIS.DataProvider.Data.AdoHelper db = MyDB.GetDBHelperByConnectionName("PostgreSQL");            IDataParameter para = db.GetParam

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

注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于PostgreSQL自带数组类型,所以有一个自定义函数的入参就是一个int数组,形如: CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4)... 1 如上所示,参数是一个int数组,Mybatis提

PostgreSQL存储过程返回数据集实例

这里用一个实例来演示PostgreSQL存储过程如何返回数据集. 1 首先准备数据表 <pre name="code" class="sql">//member_category create table member_category(id serial, name text, discount_rate real, base_integral integer); alter table member_category add primary key(

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

1 ActionUrl c = new ActionUrl() { ActionName="test", RequestUrl="/123/123", SubTime=DateTime.Now }; 2 //增 3 using (EntityContext db = new EntityContext()) 4 { 5 6 /*方法1*/ 7 db.ActionUrls.Add(c); 8 db.SaveChanges(); 9 /*方法2*/ 10 db.Set&

javascript的return语句简单介绍

javascript的return语句简单介绍:return语句在js中非常的重要,不仅仅具有返回函数值的功能,还具有一些特殊的用法,有个清晰的把握是非常有必要的.下面就结合实例简单介绍一下return语句的作用.一.用来返回控制和函数结果:通常情况,return语句对于一个函数是很有必要的,因为往往需要函数在一系列的代码执行后会得到一个期望的返回值,而此值就是通过return语句返回,并且将控制权返回给主调函数.语法格式: return 表达式 代码实例如下: function add(){

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

1.关系操作符 注意点:1)比较操作数是两个字符串,是比较字符串的字符编码值. 如:"a" > "b"  返回 false:"a" > "B"  返回 true; 2)[特别注意]如果是比较两个数字类型的字符串,也是按照字符编码值比较. 如:"256" > "6"  返回 false; 2.相等==和全等=== 区别:相等比较有隐式类型转换,而全等则没有类型和数据都要相

还未打破的砂锅之——深究finally代码块与return语句的执行顺序!

问到finally代码块的执行顺序,就算刚刚学编程的新手都能好不犹豫的说出答案:不管异常与否,finally语句块的代码一定会被执行!虽然博主尚未完全搞懂其中奥妙,但是希望下面的代码能引起读者的深思,有人觉得明白与否没有太大意义,但我相信每个向上的人面对知识时都要有一颗近乎朝圣的心,因为我们是站在巨人或前人的肩膀上前进,因为我们还很渺小!其实明白与否很有意义,因为它涉及着你以后在finally代码块中的逻辑.话不多说,请看代码: public class finallyTest { public

存储过程与SQL语句如何选择

58到家数据库30条军规,有一条是“禁止使用存储过程.视图.触发器.Event”, 高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”, 并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”. 数据库擅长存储与索引,在目前的互联网系统架构中,服务器的扩展要比存储的扩展更简单, 需要考虑系统可能的瓶颈在服务器还是数据存储,存储过程有它的优点,应该在开发中合理的选用. 应用存储过程的优点 存储过程是一组预先创建

try catch finally中return语句与非return语句的执行顺序问题

finally语句一定是会被执行的,不管前边的try块catch块中有无return语句,并且如果finally中存在return语句,这个return语句将会是最后执行的return语句,即函数最后的返回值.try,catch中的return并不是让函数直接返回,而是return语句执行完毕,把返回结果放到函数栈中,转而执行finally块,所以,若是finally中含有return语句,那么函数栈中的返回值将被刷新.看以下几种情况: 1:try有return,finally无 public