PostgreSQL-存储过程
存储过程其实就是函数,由一组 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-存储过程的更多相关文章
- Postgresql 存储过程调试 1
		看来人真的有些力不从心,半个月前还很得意掌握的简单的Postgresql 存储过程的调试,一段时间没使用,做新功能就忘了! Postgresql 在开源的数据库里面算是很强悍的了,但现在就是不方便调试 ... 
- Mybatis调用PostgreSQL存储过程实现数组入参传递
		注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递 > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于Pos ... 
- 调用PostgreSQL存储过程,找不到函数名的问题
		PostgreSQL的表,函数名称都是严格区分大小写的,所以在使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定义的数据类型,也会发生这个问题. 问题描 ... 
- postgresql  存储过程动态更新数据
		-- 目标:动态更新表中数据 -- 老规矩上代码-----------------------------tablename 表名--feildname 字段名数组--feildvalue 字段值数组 ... 
- PostgreSQL存储过程<转>
		原创文章,转载请务必将下面这段话置于文章开头处(保留超链接).本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/12/27/SQL4_存储过程_St ... 
- PostgreSQL存储过程(2)-基于PL/PgSQL的存储过程
		介绍 PL/pgSQL 是PostgreSQL 数据库系统的一个可加载的过程语言. PL/pgSQL 的设计目标是创建一种可加载的过程语言,可以 用于创建函数和触发器过程, 为SQL 语言增加控制结构 ... 
- PostgreSQL 存储过程/函数
		1.有用的链接 postgresql 常用小函数 Postgresql数据库的一些字符串操作函数 PostgreSQL function里面调用function PostgreSQL学习手册(函数和操 ... 
- postgresql  存储过程动态插入数据 2
		最近学习postgresql,正一个小活要用上,所以就开始学习了!然而,学习的过程极其艰辛,但却也充满了乐趣. 一般来说数据库的操作不外如何增,删,改,查,而首要的就是要添加数据到数据库中,因为以前的 ... 
- Postgresql存储过程调试:PostgreSQL 之 Function NOTICE
		转载自http://zhenghaoju700.blog.163.com/blog/static/13585951820116782843994/ 先安装一个PostgreSQL(见补充知识) 比较O ... 
- PostGreSQL存储过程
		1 返回结果集的存储过程 -- drop FUNCTION getall();CREATE or REPLACE FUNCTION getall() RETURNS SETOF users AS$B ... 
随机推荐
- ubuntu 14.04 安装ntp
			安装 sudo apt-get install ntp 修改ntp.conf配置文件 sudo vi /etc/ntp.conf 修改为如下内容 # Enable this if you want s ... 
- mybatis中foreach参数过多效率很慢的优化
			foreach 后面in 传入的参数有1万条,#和$是有效率区别的,$的效率远高于#,上篇文章做了比较. 但没达到我的理想结果. 1. 更改方式,把foreach 去掉,改成拼装方式, 参数直接拼装成 ... 
- 获得数据源和路径desc.catalogPath
			workspace:C:\Users\dell\Documents\ArcGIS\Default.gdb\ddf inPath:c:\users\dell\documents\arcgis\defau ... 
- Spring事务知识点
			事务的传播属性 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.// 最常用,@Transactional注解默认 PROPAGA ... 
- The first one spawns an additional process forwarding requests to a series of workers (think about it as a form of shield, at the same level of apache or nginx), while the second one sets workers to n
			Things to know (best practices and “issues”) READ IT !!! — uWSGI 2.0 documentationhttps://uwsgi-docs ... 
- SQL-W3School-高级:SQL DEFAULT 约束
			ylbtech-SQL-W3School-高级:SQL DEFAULT 约束 1.返回顶部 1. SQL DEFAULT 约束 DEFAULT 约束用于向列中插入默认值. 如果没有规定其他的值,那么会 ... 
- LVS+Keepalived小试牛刀
			一.ipvsadm命令1.基本命令操作1.1)添加规则 ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout] [-M netm ... 
- html+大文件上传
			前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对 Http 协议较模糊,故这次采用渐进的方式来学习文件上传的原理与实践. ... 
- using代码性能影响?
			Q:using当作命名空间?A:对代码编译有影响,对代码执行无任何影响:https://www.cnblogs.com/Interkey/p/UsingNameSpace.html Q:using用来 ... 
- 大数据(2)---HDFS集群搭建
			一.准备工作 1.准备几台机器,我这里使用VMware准备了四台机器,一个name node,三个data node. VMware安装虚拟机:https://www.cnblogs.com/niju ... 
