Postgresql PL/PGSQL 程序语言系列 1 (存储过程过时了吗,与函数)

2020-09-18 10:53:25 浏览数 (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函数, 传递参数, 如何在内部控制函数, 从函数内部返回一个结果.

代码语言:javascript复制
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, 原值与随机值的乘积,以及取输入值中最大的整数值,四舍五入进行插入.如果这个使用程序编写和调用函数比较, 相对的还是调用函数比较简单.

代码语言:javascript复制
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 都需要重新修改程序和打包,部署. 如果采用了函数的方式,修改和更新都要较程序简单. 当然有些程序中无度不区分应用场景使用存储过程和函数,造成性能问题,的另说, 但不能将其归罪与存储过程和函数本身,终究是使用的那些人的水平才应该是被.......

0 人点赞