Postgresql PL/PGSQL 程序语言系列 1 (存储过程过时了吗,与函数)
年龄到底是不是一个问题,35岁是一个坎, 招聘中有一些门槛这不奇怪,奇怪的是那这些信息去贩卖的人, 让整体的中国中年人活在焦虑和不安中,这绝对不是一个好人应该做的事情, 小范围的事实是可以控制的, 而肆无忌惮的"大喇叭"
,甚至歪曲部分内容,到底要利用这些信息吸引流量,造成全社会的恐惧, 你心安吗?
年龄到底是不是一个问题,其实看个体,个人秉着不学点什么就难受的精神并未受到那些歪曲事实的信息的影响, 有开始了新的一个星期的文字.
DB层关于语言的能力其实是在下降的,尤其在使用了NOSQL, 以及MYSQL 后,数据库本身的语言SQL 的能力变得不再重要,或不再需要,这也就导致,ORALCE SQL SERVER 的先辈们的那些过程语言被抛弃. POSTGRESQL 本身也是有强大PL/PGSQL的, 有些环节和场景, 写好PL/PGSQL也是一种能力.
正文 本系列也是根据一本POSTGRESQL SERVER Programming的书而来的,其中可能有一些个人的扩展,和例子.
___________________________________________________________________________
The simplest and least powerful way of looking at server programming is to view the database as a data bucket.
这段的第一句,在服务器程序领域将数据库看成一个数据容器是最简单和无技术含量的.
上面这段就不在解释了,有点含沙射影某数据库,从某种角度来看他说的不无道理,如果一次能批处理数据,但还要一行行的通过主键来处理,的确是drawbacks.
此书的作者是一个有着27年工作经验的人士,上这段话可以看出作者还是有两把刷子的. 其中提到, 以客户为中心的程序开发理论中总是将数据库与存储过程进行隔离, 其设计的目标通常是源于让应用程序来控制整个业务的逻辑,应用开发非常重要,而数据库则就是一个必须存在的"非必须".
这样的观点就类似你有一台奔驰AMG45 ,但你却那他当一辆奔驰C200开.数据库被大材小用了.
所以到此为止,上面的一段解释了为什么要学习PL/PGSQL 以及部分继续使用存储过程人的一些观点.
画了一张图,来表达作者想要莫奥数的两种应用程序架构不同的设计思路和想法
角度1 我们可以理解为, NOSQL, MYSQL ,
角度2 我们可以理解为 ORACLE SQL SERVER POSTGERSQL
等
个人认为传统数据库和NOSQL NEWSQL 在应用程序的角度的不同点,这里是算是一个重点. 所以你没有听过 MYSQL SQL. 因为只要是MYSQL一定是和高并发,小事务有关的, 存储过程在MYSQL的应用场景是无法存活的.
下面就从POSTGRESQL 的函数开始, 四个部分 建立一个PG函数, 传递参数, 如何在内部控制函数, 从函数内部返回一个结果.
CREATE FUNCTION mid(varchar, integer, integer) RETURNS varchar
AS $$
BEGIN
RETURN substring($1,$2,$3);
END;
$$
LANGUAGE plpgsql;
SELECT public.mid('Kirk L. Roybal',9,1);
上面的函数定义了, 传入的参数的数据类型,以及返回数据的类型,通过$$来界定存储过程$$ 并且在最下面标注上的函数的语言是plpgsql. 通过return 来讲结果返回.
这里多说一句POSTGRESQL 的函数和存储过程,是可以通过其他语言来进行撰写, C ,PYTHON 等都是可以.
下面以一个简单的例子来结束今天的文字
下面需要一个函数,在程序中调用,输入一个值,对输入的值的原值,原值基础上增加100, 原值与随机值的乘积,以及取输入值中最大的整数值,四舍五入进行插入.如果这个使用程序编写和调用函数比较, 相对的还是调用函数比较简单.
create table camulate (id SERIAL primary key,
base_number numeric,
base_100 numeric,
round numeric,
ceil_s numeric)
CREATE or Replace FUNCTION insert_s(numeric) RETURNS varchar
AS $$
BEGIN
insert into camulate (base_number,base_100,round,ceil_s) values ($1,$1+100,random()*$1,ceiling($1));
RETURN $1;
END;
$$
LANGUAGE plpgsql;
select insert_s(1);
select insert_s(1.4444);
select insert_s(2.7039);
另外可能还牵扯一个灵活性的问题,尤其函数,如果相关的功能变化,无论是JAVA 还是.NET 都需要重新修改程序和打包,部署. 如果采用了函数的方式,修改和更新都要较程序简单. 当然有些程序中无度不区分应用场景使用存储过程和函数,造成性能问题,的另说, 但不能将其归罪与存储过程和函数本身,终究是使用的那些人的水平才应该是被.......
- Java Web开发学习之路2012版
- TortoiseSVN客户端使用的2个配置问题
- JavaWeb(二)会话管理之细说cookie与session
- 概率论09 期望
- Javascript中数组的sort()和reverse()方法
- CentOS6.5开放端口,配置防火墙
- JavaWeb(一)Servlet中乱码解决与转发和重定向的区别
- Java魔法堂:四种引用类型、ReferenceQueue和WeakHashMap
- Javascript中数组的使用
- JavaWeb(一)Servlet中的request与response
- 数据库18456错误怎么解决
- JavaWeb(一)Servlet中的ServletConfig与ServletContext
- 语义化HTML:p、h1-6、q、blockquote、hr、address、code、pre、var、cite、dfn和samp
- Win7系统 IIS 调试ASP(aspcmsgbk25) 错误号:3706 提示 “未找到提供程序 该程序可能未正确安装”解决办法
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- docker安装kibana
- JavaWeb——ServletContext对象的使用及文件下载案例实战
- (最新 9000 字 )Spring Boot 配置特性解析
- JavaWeb——HTTP响应协议及Response对象使用方法一点通及案例实战(重定向、输出字符/字节数据到浏览器、验证码实现)
- drf序列化器之反序列化的数据验证
- yum仅下载不安装---保留rpm包
- Java——数据库编程JDBC之JDBCTemplate的使用简化数据库操作步骤(含增删改查练习实例源码)
- Java——数据库编程JDBC之数据库连接池技术(C3P0与Druid,提供了Druid的工具类)
- MySQL数据库——多表查询之内连接查询、外连接查询、子查询
- MySQL数据库——表的约束(非空约束、唯一约束、主键约束、外键约束)
- 如何取消rxjs Observable的订阅
- 使用Angular rxjs打印鼠标点击事件的x坐标之和
- js变量提升 和函数提升
- JavaWeb——HTTP请求协议及request对象使用方法一点通与request登录实战案例(含BeanUtils类的使用)
- redis学习(二十一)