• 售前

  • 售后

热门帖子
入门百科

Postgresql自定义函数详解

[复制链接]
jj13904198394 显示全部楼层 发表于 2021-10-26 12:24:13 |阅读模式 打印 上一主题 下一主题
PostgreSQL函数也称为PostgreSQL存储过程。 PostgreSQL函数或存储过程是存储在数据库服务器上并可以使用SQL界面调用的一组SQL和过程语句(声明,分配,循环,控制流程等)。
语法:
  1. CREATE [OR REPLACE] FUNCTION function_name (arguments)  
  2. RETURNS return_datatype AS $variable_name$
  3. DECLARE
  4.   declaration;
  5.   [...]
  6. BEGIN
  7.   < function_body >
  8.   [...]
  9.   RETURN { variable_name | value }
  10. END; LANGUAGE plpgsql;
复制代码
参数分析

function_name:指定函数的名称。
[OR REPLACE]:是可选的,它允许修改/更换现有函数。
DECLARE:界说参数(参数名写在前面 类型写在背面)。
BEGIN~END: 在中心写方法主体。
RETURN:指定要从函数返回的数据类型(它可以是基础,复合或域类型,或者也可以引用表列的类型)。
LANGUAGE:它指定实现该函数的语言的名称。
下面我将创建一个简单的函数:
  1. CREATE OR REPLACE FUNCTION test(id uuid)
  2. RETURNS INTEGER
  3. LANGUAGE plpgsql
  4. AS
  5. $$
  6. declare
  7. count integer;
  8. begin
  9. count = (SELECT
  10.        json_array_length(A.json::json -> 'features')
  11.       FROM "Json" A
  12.       WHERE A.uid = id);
  13. return count;
  14. end;
  15. $$
复制代码
该函数的功能是用来返回json中数组的长度的
界说好该函数后,我们可以像调用其他的函数一样调用它
  1. SELECT test(id)
复制代码
返回数组长度(integer)
增补:PostgreSQL中自界说函数(function)返回数据集
1.预备数据

建表
  1. create table city (
  2. cityId int,
  3. cityName varchar(20)
  4. );
复制代码
插入数据
  1. insert into city values(1,'BeiJing'),(2,'NewYork'),(3,'Hong kong'),(4,'ShaingHai');
复制代码
2. 函数实例

2.1 setof 表名
创建函数getCity(),它返回city表中所有的数据,返回值声明为 setof 表名。
  1. create or replace function getCity() returns setof city as
  2. $$
  3. begin
  4. return query select * from city;
  5. end;
  6. $$
  7. language plpgsql;
复制代码
实行函数。
  1. mydb=# select getCity();
  2.    getcity
  3. -----------------
  4. (1,BeiJing)
  5. (2,NewYork)
  6. (3,"Hong kong")
  7. (4,ShaingHai)
  8. (4 行记录)
复制代码
也可以用类似查询表的方式。
  1. mydb=# select * from getCity();
  2. cityid | cityname
  3. --------+-----------
  4.    1 | BeiJing
  5.    2 | NewYork
  6.    3 | Hong kong
  7.    4 | ShaingHai
  8. (4 行记录)
复制代码
PostgreSQL还支持对函数实行结果举行条件判断并过滤。
  1. mydb=# select * from getCity() where cityId > 3;
  2. cityid | cityname
  3. --------+-----------
  4.    4 | ShaingHai
  5. (1 行记录)
复制代码
2.2 setof record
为了使函数更加通用,以解决动态返回数据集的问题。创建函数getRows(text),将表名city作为函数参数,它返回表中所有的数据,返回值声明为 setof record。
  1. create or replace function getRows(text) returns setof record as
  2. $$
  3. declare
  4. rec record;
  5. begin
  6. for rec in EXECUTE 'select * from ' || $1 loop
  7. return next rec;
  8. end loop;
  9. return;
  10. end
  11. $$
  12. language 'plpgsql';
复制代码
实行函数。
  1. mydb=# select * from getRows('city') as city(id int, name varchar(20));
  2. id |  name
  3. ----+-----------
  4. 1 | BeiJing
  5. 2 | NewYork
  6. 3 | Hong kong
  7. 4 | ShaingHai
  8. (4 行记录)
复制代码
以上为个人履历,希望能给各人一个参考,也希望各人多多支持草根技能分享。如有错误或未思量完全的地方,望不吝见教。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作