存储过程其实就是函数,由一组 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. python常用模块介绍

    关于if __name__ == "__main__": 若执行文件为bin,调用文件为cal: 若在执行文件bin中执行print(__name__) 输出:__main__ 当 ...

  2. tomcat单机多实例

    catalina.home指向公用信息的位置,就是bin和lib的父目录. catalina.base指向每个Tomcat目录私有信息的位置,就是conf.logs.temp.webapps和work ...

  3. python将py文件转换为pyc

    python -m py_compile lib/ylpy.py python -m py_compile lib/ylpy.py python 一个.py文件如何调用另一个.py文件中的类和函数 A ...

  4. Mac OS 下三种修改Hosts文件的方法

    一.系统偏好设置修改 1.打开系统偏好设置,底部有一个Hosts的快捷入口2.输入ip和hostname后,回车确定,勾选改host即可   二.终端命令行修改 sudo vi /etc/hosts ...

  5. Flume-自定义 Interceptor(拦截器)

    使用 Flume 采集服务器本地日志,需要按照日志类型的不同,将不同种类的日志发往不同的分析系统. 在实际的开发中,一台服务器产生的日志类型可能有很多种,不同类型的日志可能需要发送到不同的分析系统. ...

  6. PHP学习之工厂模式

    <?php //工厂模式 interface Doing { function eat(); function sleep(); } class Cat implements Doing { f ...

  7. 《你不知道的JavaScript(上)》笔记——函数作用域和块作用域

    关于函数声明:如果 function 是声明中的第一个词, 那么就是一个函数声明, 否则就是一个函数表达式.例如匿名函数这种形式,函数会被当作函数表达式而不是一个标准的函数声明来处理. (functi ...

  8. ZSDR017

    *---------------------------------------------------------------------- *ZSDR017-客户订货价格和库存 *-------- ...

  9. [转]德哥的PostgreSQL私房菜 - 史上最屌PG资料合集

    链接地址:https://yq.aliyun.com/articles/59251

  10. 在谷歌中缓存下载视频离线观看,js代码

    var download=function(urlInfo) { when(createFile(localFileName)) .then(function (fileInfo) { var dow ...