存储过程其实就是函数,由一组 sql 语句组成,实现比较复杂的数据库操作;

存储过程 是 存储在 数据库服务器 上的,用户可以像调用 sql 自带函数一样 调用存储过程

语法解析

CREATE [OR REPLACE] FUNCTION function_name (arguments)
RETURNS return_datatype AS $variable_name$
DECLARE
declaration;
[...]
BEGIN
< function_body >
[...]
RETURN { variable_name | value }
END; LANGUAGE plpgsql;

很容易理解,不多解释

下面我对一张表进行简单操作,逐步递进的介绍存储过程的语法

步骤1-基础版

into 表示把结果赋值给 后面的变量,该变量必须在 declare 提前声明

调用存储过程

select mycount3()

步骤2-把 sql 语句赋给变量

create or replace function mycount3()
returns integer as $$ declare
mysql text;
counts integer; begin
mysql:='select count("CD_ID") from "CDS"';
execute mysql into counts;
return counts;
end; $$ language plpgsql;

步骤3-带变量,且 sql 语句用字符串拼接

create or replace function mycount4(tableName text, columnName text)
returns text as $$ declare
mysql text; begin
mysql:='select count('
|| quote_ident(columnName)
|| ') from '
|| quote_ident(tableName); return mysql; end; $$ language plpgsql;

1. 函数的参数必须声明类型

2. || 表示字符串拼接符号

3. 存储过程中的对象不能直接引用变量,要用 quote_ident,它的作用是为字符串加上 双引号

4. 在 sql 语句中,大写,全部会变成小写,如果想保留大写,需要加 双引号

调用存储过程

select mycount4('CDS', 'CD_ID');

返回

select count("CD_ID") from "CDS"

可以看到,输入参数是单引号,经过 quote_ident 后,自动变成双引号,保留了大写

步骤4-换一种拼接方式,并且函数体加了 if 判断

create or replace function mycount4(tableName text, columnName text)
returns integer as $$ declare
mysql text;
counts integer; begin
mysql:='select count("' || $2 || '") from "' || $1 || '" ';
execute mysql into counts using tableName, columnName; if counts > 100 then
return counts;
else return 1;
end if; end; $$ language plpgsql;

1. 用 using 调取变量,此时需要自己加 双引号 以保留 大写

2. $1 $2 对应的是函数的参数位置,跟 using 后的顺序无关

3. if 后面有个 then

4. text 可变长度字符串

5. 每句末尾必须带分号

参考资料:

https://www.yiibai.com/postgresql/postgresql-functions.html

https://www.cnblogs.com/ssqhan/p/7289931.html#top

PostgreSQL-存储过程的更多相关文章

  1. Postgresql 存储过程调试 1

    看来人真的有些力不从心,半个月前还很得意掌握的简单的Postgresql 存储过程的调试,一段时间没使用,做新功能就忘了! Postgresql 在开源的数据库里面算是很强悍的了,但现在就是不方便调试 ...

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

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

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

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

  4. postgresql 存储过程动态更新数据

    -- 目标:动态更新表中数据 -- 老规矩上代码-----------------------------tablename 表名--feildname 字段名数组--feildvalue 字段值数组 ...

  5. PostgreSQL存储过程<转>

    原创文章,转载请务必将下面这段话置于文章开头处(保留超链接).本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/12/27/SQL4_存储过程_St ...

  6. PostgreSQL存储过程(2)-基于PL/PgSQL的存储过程

    介绍 PL/pgSQL 是PostgreSQL 数据库系统的一个可加载的过程语言. PL/pgSQL 的设计目标是创建一种可加载的过程语言,可以 用于创建函数和触发器过程, 为SQL 语言增加控制结构 ...

  7. PostgreSQL 存储过程/函数

    1.有用的链接 postgresql 常用小函数 Postgresql数据库的一些字符串操作函数 PostgreSQL function里面调用function PostgreSQL学习手册(函数和操 ...

  8. postgresql 存储过程动态插入数据 2

    最近学习postgresql,正一个小活要用上,所以就开始学习了!然而,学习的过程极其艰辛,但却也充满了乐趣. 一般来说数据库的操作不外如何增,删,改,查,而首要的就是要添加数据到数据库中,因为以前的 ...

  9. Postgresql存储过程调试:PostgreSQL 之 Function NOTICE

    转载自http://zhenghaoju700.blog.163.com/blog/static/13585951820116782843994/ 先安装一个PostgreSQL(见补充知识) 比较O ...

  10. PostGreSQL存储过程

    1 返回结果集的存储过程 -- drop FUNCTION getall();CREATE or REPLACE FUNCTION getall() RETURNS SETOF users  AS$B ...

随机推荐

  1. 非旋treap

    目录 核心思想 核心操作 其他操作 参考程序 核心思想 主要的思想与treap是一样的.通过让二叉查找树同时满足堆(随机参数)的性质来防止深度过大.与普通treap不同的是非旋treap通过树的分裂与 ...

  2. java web课程管理系统开发实例(从数据库连接到代码)

    以下是几个简单知识: JavaBean:用于传递数据,拥有与数据相关的逻辑处理 JSP:从Model接收数据并生成HTML Servlet:接收HTTP请求并控制Model和View jdbc:用于配 ...

  3. JavaWeb_(Mybatis框架)动态sql_七

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  4. 'builtin_function_or_method' object has no attribute 'translate'

    'builtin_function_or_method' object has no attribute 'translate' 首先这个错误的意思是:内建函数或方法对象不能转换成对应的属性. #错误 ...

  5. Apache Flink - 分布式运行环境

    1.任务和操作链 下面的数据流图有5个子任务执行,因此有五个并行线程. 2.Job Managers, Task Managers, Clients Job Managers:协调分布式运行,他们安排 ...

  6. err="etherbase address must be explicitly specified"

    如果要初始化区块链的话就用创始区块   如果通过创世区块来初始化区块链的话,首先需要一个初始化区块链的json文件,如下. { "config": { "chainId& ...

  7. Understanding the ASP.NET MVC Execution Process

    https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/overview/understanding-the-asp ...

  8. Mac下安装MySQL 5.6.40

    Mac下安装MySQL 5.6.40 - 干勾鱼的CSDN博客 - CSDN博客   原创 Mac下安装MySQL 5.6.40 2018-06-18 10:34:03 我是干勾鱼 阅读数 5927 ...

  9. ForkJoinPool 源码分析

    ForkJoinPool ForkJoinPool 是一个运行 ForkJoinTask 任务.支持工作窃取和并行计算的线程池 核心参数+创建实例 // 工作者线程驻留任务队列索引位 static f ...

  10. Swift中添加标记(MARK)和警告(TODO FIXME)

    //MARK: - 注释说明 //FIXME: - 表示此处有bug 或者要优化 //TODO:  - 一般用于写到哪了 做个标记,让后回来继续 开启警告: 参考博客: http://blog.csd ...