PostgreSQL学习手册(PLpgSQL过程语言)

合集下载

postgresql教程

postgresql教程

postgresql教程PostgreSQL是一个开源的关系数据库管理系统(RDBMS),它的目标是成为最先进的开源数据库,并支持许多标准SQL 功能以及一些不同的高级功能。

本教程将向您介绍PostgreSQL的基本概念和用法。

我们将从安装和设置开始,然后逐步深入了解表、视图、索引、事务和查询等主题。

第一部分:安装和设置在本部分中,我们将向您介绍如何下载、安装和设置PostgreSQL数据库。

我们还将介绍一些基本概念和术语,如数据库、表和列。

1. 安装PostgreSQL:在本节中,我们将向您展示如何从官方网站或其他来源下载并安装PostgreSQL。

2. 设置数据库连接:在本节中,我们将介绍如何设置和配置数据库连接,包括创建用户、设置密码和分配权限等内容。

3. 创建数据库和表:在本节中,我们将介绍如何创建数据库和表,并向您展示一些常用的数据类型和约束。

第二部分:表和视图在本部分中,我们将更详细地介绍表格和视图的概念,并向您展示如何使用它们来存储和查询数据。

1. 创建和修改表格:在本节中,我们将介绍如何创建新的表格,并向您展示如何修改和删除现有的表格。

2. 数据类型和约束:在本节中,我们将深入了解不同的数据类型和约束,并向您展示如何使用它们来保证数据的完整性和一致性。

3. 视图和触发器:在本节中,我们将向您展示如何创建和使用视图和触发器,以及如何利用它们来简化复杂的查询和操作。

第三部分:索引和查询优化在本部分中,我们将介绍索引和查询优化的概念,并向您展示如何使用索引来提高查询性能。

1. 索引的概念和类型:在本节中,我们将介绍不同类型的索引,如B-tree、哈希和GiST索引,并向您展示如何创建和使用它们。

2. 查询优化和性能调优:在本节中,我们将介绍一些常见的查询优化技术,如查询计划、索引优化和统计信息收集等。

3. 复杂查询和连接:在本节中,我们将向您展示如何编写复杂的查询,包括多表连接、子查询和聚合等。

PostgreSQL学习手册(数据库管理)

PostgreSQL学习手册(数据库管理)

PostgreSQL学习手册(数据库管理)一、概述:数据库可以被看成是SQL对象(数据库对象)的命名集合,通常而言,每个数据库对象(表、函数等)只属于一个数据库。

不过对于部分系统表而言,如pg_database,是属于整个集群的。

更准确地说,数据库是模式的集合,而模式包含表、函数等SQL对象。

因此完整的对象层次应该是这样的:服务器、数据库、模式、表或其他类型的对象。

在与数据库服务器建立连接时,该连接只能与一个数据库形成关联,不允许在一个会话中进行多个数据库的访问。

如以postgres用户登录,该用户可以访问的缺省数据库为postgres,在登录后如果执行下面的SQL语句将会收到PostgreSQL给出的相关错误信息。

postgres=# SELECT * FROM MyTest."MyUser".testtables;ERROR: cross-database references are not implemented: "otherdb.otheruser.sometable"LINE 1: select * from otherdb.otheruser.sometable在PostgreSQL中,数据库在物理上是相互隔离的,对它们的访问控制也是在会话层次上进行的。

然而模式只是逻辑上的对象管理结构,是否能访问某个模式的对象是由权限系统来控制的。

执行下面的基于系统表的查询语句可以列出现有的数据库集合。

SELECT datname FROM pg_database;注:psql应用程序的\l元命令和-l命令行选项也可以用来列出当前服务器中已有的数据库。

二、创建数据库:在PostgreSQL服务器上执行下面的SQL语句可以创建数据库。

CREATE DATABASE db_name;在数据库成功创建之后,当前登录角色将自动成为此新数据库的所有者。

在删除该数据库时,也需要该用户的特权。

PostgreSQL学习手册:SQL语言函数

PostgreSQL学习手册:SQL语言函数

PostgreSQL学习手册:SQL语言函数一、基本概念:SQL函数可以包含任意数量的查询,但是函数只返回最后一个查询(必须是SELECT)的结果。

在简单情况下,返回最后一条查询结果的第一行。

如果最后一个查询不返回任何行,那么该函数将返回NULL值。

如果需要该函数返回最后一条SELECT语句的所有行,可以将函数的返回值定义为集合,即SETOF sometype。

SQL函数的函数体应该是用分号分隔的SQL语句列表,其中最后一条语句之后的分号是可选的。

除非函数声明为返回void,否则最后一条语句必须是SELECT。

事实上,在SQL函数中,不仅可以包含SELECT查询语句,也可以包含INSERT、UPDATE和DELETE等其他标准的SQL 语句,但是和事物相关的语句不能包含其中,如BEGIN、COMMIT、ROLLBACK和SAVEPOINT 等。

CREATE FUNCTION命令的语法要求函数体写成一个字符串文本。

通常来说,该文本字符串常量使用美元符($$)围住,如:CREATE FUNCTION clean_emp() RETURNS void AS $$DELETE FROM emp WHERE salary < 0;$$ LANGUAGE SQL;最后需要说明的是SQL函数中的参数,PostgreSQL定义$1表示第一个参数,$2为第二个参数并以此类推。

如果参数是复合类型,则可以使用点表示法,即$访问复合类型参数中的name字段。

需要注意的是函数参数只能用作数据值,而不能用于标识符,如:INSERT INTO mytable VALUES ($1); --合法INSERT INTO $1 VALUES (42); --不合法(表名属于标示符之一)二、基本类型:最简单的SQL函数可能就是没有参数且返回基本类型的函数了,如:CREATE FUNCTION one() RETURNS integer AS $$SELECT 1 AS result;$$ LANGUAGE SQL;下面的例子声明了基本类型作为函数的参数。

PostgreSQL学习手册

PostgreSQL学习手册

tgreSQL学习手册(五) 函数和操作符阿里云携手开源中国众包平台发布百万悬赏项目»一、逻辑操作符:常用的逻辑操作符有:AND、OR和NOT。

其语义与其它编程语言中的逻辑操作符完全相同。

二、比较操作符:下面是PostgreSQL中提供的比较操作符列表:操作符描述<小于>大于<=小于或等于>=大于或等于=等于!=不等于比较操作符可以用于所有可以比较的数据类型。

所有比较操作符都是双目操作符,且返回boolean类型。

除了比较操作符以外,我们还可以使用BETWEEN语句,如:a BETWEEN x AND y 等效于 a >= x AND a <= ya NOT BETWEEN x AND y 等效于 a < x OR a > y三、数学函数和操作符:下面是PostgreSQL中提供的数学操作符列表:操作符描述例子结果+加 2 + 35-减 2 - 3-1*乘 2 * 36/除 4 / 22%模 5 % 41^幂 2.0 ^ 3.08|/平方根|/ 25.05||/立方根||/ 27.03!阶乘 5 !120!!阶乘!! 5120@绝对值@ -5.05&按位AND91 & 1511|按位OR32 | 335#按位XOR17 # 520~按位NOT~1-2<<按位左移 1 << 416>>按位右移8 >> 22按位操作符只能用于整数类型,而其它的操作符可以用于全部数值数据类型。

按位操作符还可以用于位串类型bit和bit varying,下面是PostgreSQL中提供的数学函数列表,需要说明的是,这些函数中有许多都存在多种形式,区别只是参数类型不同。

除非特别指明,任何特定形式的函数都返回和它的参数相同的数据类型。

函数返回类型描述例子结果abs(x)绝对值abs(-17.4)17.4 cbrt(double)立方根cbrt(27.0)3ceil(double/numeric)不小于参数的最小的整数ceil(-42.8)-42degrees(double) 把弧度转为角度degrees(0.5)28.6478897565412 exp(double/numeric)自然指数exp(1.0) 2.71828182845905 floor(double/numeric)不大于参数的最大整数floor(-42.8)-43ln(double/numeric)自然对数ln(2.0)0.693147180559945 log(double/numeric)10为底的对数log(100.0)2log(b numeric,x numeric)numeric指定底数的对数log(2.0, 64.0) 6.0000000000mod(y, x)取余数mod(9,4)1pi() double"π"常量pi() 3.14159265358979 power(a double, b double)double求a的b次幂power(9.0, 3.0)729power(a numeric, bnumeric)numeric求a的b次幂power(9.0, 3.0)729radians(double)double把角度转为弧度radians(45.0)0.785398163397448random()double 0.0到1.0之间的随机数值random()round(double/numeric)圆整为最接近的整数round(42.4)42round(v numeric, s int)numeric圆整为s位小数数字round(42.438,2)42.44sign(double/numeric)参数的符号(-1,0,+1) sign(-8.4)-1sqrt(double/numeric)平方根sqrt(2.0) 1.4142135623731 trunc(double/numeric)截断(向零靠近)trunc(42.8)42trunc(v numeric, s int)numeric 截断为s小数位置的数字trunc(42.438,2)42.43三角函数列表:函数描述acos(x)反余弦asin(x)反正弦atan(x)反正切atan2(x, y)正切y/x 的反函数cos(x)余弦cot(x)余切sin(x)正弦tan(x)正切四、字符串函数和操作符:下面是PostgreSQL中提供的字符串操作符列表:函数返回类型描述例子结果string || string text字串连接'Post' || 'greSQL'PostgreSQL bit_length(string)int字串里二进制位的个数bit_length('jose')32char_length(string)int字串中的字符个数char_length('jose')4convert(string using conversion_name)text使用指定的转换名字改变编码。

PostgreSQL(一)教程-----SQL语言

PostgreSQL(一)教程-----SQL语言

PostgreSQL(⼀)教程-----SQL语⾔⼀、概念PostgreSQL是⼀种关系型数据库管理系统(RDBMS)。

这意味着它是⼀种⽤于管理存储在关系中的数据的系统。

关系实际上是表的数学术语。

今天,把数据存储在表⾥的概念已经快成了固有的常识了,但是还有其它的⼀些⽅法⽤于组织数据库。

在类 Unix 操作系统上的⽂件和⽬录就形成了⼀种层次数据库的例⼦。

更现代的发展是⾯向对象数据库。

每个表都是⼀个命名的⾏集合。

⼀个给定表的每⼀⾏由同⼀组的命名列组成,⽽且每⼀列都有⼀个特定的数据类型。

虽然列在每⾏⾥的顺序是固定的,但⼀定要记住 SQL 并不对⾏在表中的顺序做任何保证(但你可以为了显⽰的⽬的对它们进⾏显式地排序)。

表被分组成数据库,⼀个由单个PostgreSQL服务器实例管理的数据库集合组成⼀个数据库集簇。

⼆、创建⼀个新表你可以通过指定表的名字和所有列的名字及其类型来创建表∶CREATE TABLE weather (city varchar(80),temp_lo int, -- 最低温度temp_hi int, -- 最⾼温度prcp real, -- 湿度date date);你可以在psql输⼊这些命令以及换⾏符。

psql可以识别该命令直到分号才结束。

你可以在 SQL 命令中⾃由使⽤空⽩(即空格、制表符和换⾏符)。

这就意味着你可以⽤和上⾯不同的对齐⽅式键⼊命令,或者将命令全部放在⼀⾏中。

两个划线("--")引⼊注释。

任何跟在它后⾯直到⾏尾的东西都会被忽略。

SQL 是对关键字和标识符⼤⼩写不敏感的语⾔,只有在标识符⽤双引号包围时才能保留它们的⼤⼩写(上例没有这么做)。

varchar(80)指定了⼀个可以存储最长 80 个字符的任意字符串的数据类型。

int是普通的整数类型。

real是⼀种⽤于存储单精度浮点数的类型。

date类型应该可以⾃解释(没错,类型为date的列名字也是date。

PostgreSQL学习手册(目录)

PostgreSQL学习手册(目录)

PostgreSQL学习⼿册(⽬录)事实上之前有很长⼀段时间都在纠结是否有必要好好学习它,但是始终都没有⼀个很好的理由说服⾃⼰。

甚⾄是直到这个项⽬最终决定选⽤PostgreSQL时,我都没有真正意识到学习它的价值,当时只是想反正和其它数据库差不多,能⽤就⾏了。

然⽽有⼀天晚上,⾃⼰也不知道为什么,躺在床上开始回想整个项⽬的实施过程,想着想着就想到了数据库选型这⼀问题上了。

事情是这样的,最初客户将他们的产品⽬标定位为主打中型规模,同时也要在⼀定程度上⽀持⼩型规模。

鉴于此,我们为他们提供的⽅案是中型规模的数据库选⽤Oracle,⼩型规模的选定MySQL,在经过多轮商谈之后这个⽅案通过了。

然⽽随着项⽬的深⼊,客户突然有⼀天提出,由于成本和市场推⼴等问题,该产品的数据库部分需要进⾏⼀定的调整,调整的结果是中型规模可以同时⽀持Oracle和MySQL,⽽⼩型规模则要同时⽀持MySQL和PostgreSQL,原因⾮常简单,PostgreSQL是纯免费的数据库产品。

听到这个消息之后,我当时就⾮常恼⽕,因为当初为了保证运⾏时效率(国标),我们的数据库访问层是完全基于数据库供应商提供的原始C接⼝开发的,甚⾄都没有考虑ODBC提供的原始C接⼝,以防在转换中失去效率,或是ODBC本⾝为了强调通⽤性⽽不得不牺牲某些数据库的优化特征,如批量插⼊、批量读取等。

最后的结果显⽽易见,客户就是上帝,上帝的意见就是真理,这样我们就不得不基于现有的访问层接⼝⼜重新开发了⼀套⽀持PostgreSQL原⽣C接⼝的驱动。

然⽽随着对PostgreSQL的不断学习,对它的了解也在逐步加深,后来发现它的功能还是⾮常强⼤的,特别是对GIS空间数据的⽀持就更加的吸引我了。

于是就在脑⼦⾥为MySQL和PostgreSQL做了⼀个简单的对⽐和分析,最后得出⼀个结论,相⽐MySQL,PostgreSQL并没有什么刚性的缺点,但是它的纯免费特征确实是MySQL⽆法⽐拟的。

Postgresql编程教程

Postgresql编程教程

PostgreSQL之存储过程篇在PostgreSQL中,过程语言(例如PL/pgSQL,C,Perl,Python和Tcl)被称为存储过程。

该过程添加了许多过程元素,例如控制结构,循环和复杂的计算,以扩展SQL标准。

它使您可以在PostgreSQL中开发复杂的功能和存储过程,而这是使用普通SQL可能无法实现的。

1.入门PostgreSQL允许使用各种过程语言元素(通常称为存储过程)使用用户定义的函数和存储过程来扩展数据库功能。

存储过程定义用于创建触发器的功能或自定义聚合功能。

此外,存储过程还添加了许多过程功能,例如控制结构和复杂的计算。

这些使您可以更轻松,更有效地开发自定义功能。

缺省情况下,PostgreSQL支持三种过程语言:SQL,PL/pgSQL和C。

还可以使用扩展将其他过程语言(例如Perl,Python和TCL)加载到PostgreSQL中。

1.1、使用PostgreSQL存储过程的优点•减少应用程序和数据库服务器之间的往返次数。

所有SQL语句都包装在存储在PostgreSQL数据库服务器中的函数内,因此应用程序仅需发出函数调用即可返回结果,而不必发送多个SQL语句并等待每次调用之间的结果。

•由于用户定义的函数和存储过程已预编译并存储在PostgreSQL数据库服务器中,因此提高了应用程序性能。

•可在许多应用程序中重用。

一旦开发了功能,就可以在任何应用程序中重用它。

1.2、使用PostgreSQL存储过程的缺点•由于存储过程编程需要许多开发人员不具备的专业技能,因此软件开发速度缓慢。

•难以管理版本且难以调试。

•可能无法移植到其他数据库管理系统,例如MySQL或Microsoft SQL Server。

2.PL/pgSQL块结构PL/pgSQL是一种块结构语言,因此,PL/pgSQL函数或存储过程被组织为块。

2.1、PL/pgSQL的语法[ <<label>> ][ DECLAREdeclarations ]BEGINstatements;...END [ label ];•每个块都有两个部分:声明和正文。

postgresql中文手册

postgresql中文手册

postgresql中文手册PostgreSQL中文手册概述PostgreSQL是一个功能强大的开源关系型数据库管理系统,它提供了多种高级特性,可以满足各种规模的应用需求。

本文档将为您介绍PostgreSQL的基本概念、使用方法以及高级特性。

第一章:入门指南1.1 安装PostgreSQL本节将指导您如何下载、安装和配置PostgreSQL。

您可以根据不同的操作系统选择适合的安装方法,并了解基本的配置选项。

1.2 数据库连接学习如何连接到PostgreSQL数据库,并使用命令行工具或者图形化界面进行操作。

您将了解如何创建、删除和管理数据库。

1.3 SQL语法PostgreSQL支持标准的SQL语法,并且还提供了许多扩展功能。

本节将介绍常用的SQL语句,包括表的创建、数据的插入、更新和删除,以及查询语句的使用。

第二章:高级特性2.1 事务管理了解PostgreSQL的事务管理功能,包括事务的启动、提交和回滚,并学习如何处理并发访问和锁定。

2.2 索引和性能优化学习如何创建索引以提高查询性能,并了解如何使用EXPLAIN命令来分析查询执行计划。

2.3 触发器和事件管理本节将介绍如何使用触发器来自动化处理某些数据库事件,并学习如何对触发器进行管理和监控。

2.4 备份和恢复学习如何创建数据库的备份,并了解如何恢复数据库的数据。

第三章:高级应用3.1 数据复制本节介绍PostgreSQL的数据复制功能,包括主从复制和逻辑复制。

您将学习如何配置复制服务器,并设置故障转移和负载均衡。

3.2 分区表了解如何使用分区表来提高查询性能和管理大型数据集。

3.3 全文搜索学习如何使用PostgreSQL的全文搜索功能,包括设置搜索引擎和执行高级搜索查询。

3.4 GIS支持了解如何使用PostGIS扩展来处理地理信息系统数据,并学习如何执行GIS查询和空间分析。

结论本文档提供了关于PostgreSQL的全面介绍,包括基本概念、使用方法和高级特性。

PostgreSQL学习手册(PLpgSQL过程语言)

PostgreSQL学习手册(PLpgSQL过程语言)

PostgreSQL学习⼿册(PLpgSQL过程语⾔)⼀、概述:PL/pgSQL函数在第⼀次被调⽤时,其函数内的源代码(⽂本)将被解析为⼆进制指令树,但是函数内的表达式和SQL命令只有在⾸次⽤到它们的时候,PL/pgSQL解释器才会为其创建⼀个准备好的执⾏规划,随后对该表达式或SQL命令的访问都将使⽤该规划。

如果在⼀个条件语句中,有部分SQL命令或表达式没有被⽤到,那么PL/pgSQL解释器在本次调⽤中将不会为其准备执⾏规划,这样的好处是可以有效地减少为PL/pgSQL函数⾥的语句⽣成分析和执⾏规划的总时间,然⽽缺点是某些表达式或SQL命令中的错误只有在其被执⾏到的时候才能发现。

由于PL/pgSQL在函数⾥为⼀个命令制定了执⾏计划,那么在本次会话中该计划将会被反复使⽤,这样做往往可以得到更好的性能,但是如果你动态修改了相关的数据库对象,那么就有可能产⽣问题,如:CREATE FUNCTION populate() RETURNS integer AS $$DECLARE-- 声明段BEGINPERFORM my_function();END;$$ LANGUAGE plpgsql;在调⽤以上函数时,PERFORM语句的执⾏计划将引⽤my_function对象的OID。

在此之后,如果你重建了my_function函数,那么populate函数将⽆法再找到原有my_function函数的OID。

要解决该问题,可以选择重建populate函数,或者重新登录建⽴新的会话,以使PostgreSQL重新编译该函数。

要想规避此类问题的发⽣,在重建my_function时可以使⽤CREATE OR REPLACE FUNCTION命令。

鉴于以上规则,在PL/pgSQL⾥直接出现的SQL命令必须在每次执⾏时均引⽤相同的表和字段,换句话说,不能将函数的参数⽤作SQL命令的表名或字段名。

如果想绕开该限制,可以考虑使⽤PL/pgSQL中的EXECUTE语句动态地构造命令,由此换来的代价是每次执⾏时都要构造⼀个新的命令计划。

PostgreSQL学习手册(PLpgSQL过程语言)

PostgreSQL学习手册(PLpgSQL过程语言)

一、概述:PL/pgSQL函数在第一次被调用时,其函数内的源代码(文本)将被解析为二进制指令树,但是函数内的表达式和SQL命令只有在首次用到它们的时候,PL/pgSQL解释器才会为其创建一个准备好的执行规划,随后对该表达式或SQL命令的访问都将使用该规划。

如果在一个条件语句中,有部分SQL命令或表达式没有被用到,那么PL/pgSQL解释器在本次调用中将不会为其准备执行规划,这样的好处是可以有效地减少为PL/pgSQL函数里的语句生成分析和执行规划的总时间,然而缺点是某些表达式或SQL命令中的错误只有在其被执行到的时候才能发现。

由于PL/pgSQL在函数里为一个命令制定了执行计划,那么在本次会话中该计划将会被反复使用,这样做往往可以得到更好的性能,但是如果你动态修改了相关的数据库对象,那么就有可能产生问题,如: CREATE FUNCTION populate() RETURNS integer AS $$DECLARE-- 声明段BEGINPERFORM my_function();END;$$ LANGUAGE plpgsql;在调用以上函数时,PERFORM语句的执行计划将引用my_function对象的OID。

在此之后,如果你重建了my_function函数,那么populate函数将无法再找到原有my_function函数的OID。

要解决该问题,可以选择重建populate函数,或者重新登录建立新的会话,以使PostgreSQL重新编译该函数。

要想规避此类问题的发生,在重建my_function时可以使用CREATE OR REPLACE FUNCTION命令。

鉴于以上规则,在PL/pgSQL里直接出现的SQL命令必须在每次执行时均引用相同的表和字段,换句话说,不能将函数的参数用作SQL命令的表名或字段名。

如果想绕开该限制,可以考虑使用PL/pgSQL 中的EXECUTE语句动态地构造命令,由此换来的代价是每次执行时都要构造一个新的命令计划。

postgres do language plpgsql 用法

postgres do language plpgsql 用法

postgres do language plpgsql 用法在PostgreSQL中,PL/pgSQL是一种过程化语言,用于编写存储函数和触发器。

它类似于其他数据库中的存储过程语言,如PL/SQL(Oracle)和T-SQL(SQL Server)。

语法:```CREATE FUNCTION function_name (arguments) RETURNS return_type AS $$DECLARE-- 变量声明BEGIN-- 逻辑和操作语句RETURN return_value;END;$$ LANGUAGE plpgsql;```使用PL/pgSQL时,可以使用以下控制结构和操作来编写函数:1. 变量声明和赋值:```DECLARE variable_name type;variable_name := value;```2. IF-THEN-ELSE语句:```IF condition THEN-- 如果条件为真时要执行的语句ELSE-- 如果条件为假时要执行的语句END IF;```3. FOR循环:```FOR variable_name IN lower_limit..upper_limit LOOP -- 希望对每个循环迭代执行的语句END LOOP;```4. WHILE循环:```WHILE condition LOOP-- 希望在循环执行期间重复的语句END LOOP;```5. CASE语句:```CASEWHEN condition1 THEN-- 如果条件1为真时要执行的语句WHEN condition2 THEN-- 如果条件2为真时要执行的语句ELSE-- 如果以上条件都不为真时要执行的语句END CASE;```6. 异常处理:```BEGIN-- 代码块EXCEPTIONWHEN exception_type THEN-- 当捕获到特定异常类型时要执行的语句END;```除了上述结构和操作之外,PL/pgSQL还提供了其他一些有用的功能,如数据库操作、游标处理、字符串和日期处理等。

PostgreSQL数据库中文学习手册

PostgreSQL数据库中文学习手册

目录PostgreSQL学习手册(数据表) (4)一、表的定义: (4)PostgreSQL学习手册(模式Schema) (9)PostgreSQL学习手册(表的继承和分区) (10)一、表的继承: (10)PostgreSQL学习手册(常用数据类型) (16)一、数值类型: (16)六、数组: (22)PostgreSQL学习手册(函数和操作符<一>) (25)一、逻辑操作符: (25)四、字符串函数和操作符: (27)五、位串函数和操作符: (29)PostgreSQL学习手册(函数和操作符<二>) (30)六、模式匹配: (30)八、时间/日期函数和操作符: (33)PostgreSQL学习手册(函数和操作符<三>) (35)九、序列操作函数: (35)十二、系统信息函数: (38)PostgreSQL学习手册(索引) (42)一、索引的类型: (42)四、唯一索引: (43)PostgreSQL学习手册(事物隔离) (45)PostgreSQL学习手册(性能提升技巧) (46)一、使用EXPLAIN: (46)PostgreSQL学习手册(服务器配置) (50)一、服务器进程的启动和关闭: (50)PostgreSQL学习手册(角色和权限) (52)PostgreSQL学习手册(数据库管理) (54)一、概述: (54)PostgreSQL学习手册(数据库维护) (56)一、恢复磁盘空间: (56)二、更新规划器统计: (57)四、定期重建索引: (59)PostgreSQL学习手册(系统表) (61)一、pg_class: (61)三、pg_attrdef: (63)四、pg_authid: (64)五、pg_auth_members: (64)七、pg_tablespace: (65)十、pg_index: (67)PostgreSQL学习手册(系统视图) (68)一、pg_tables: (68)二、pg_indexes: (68)三、pg_views: (68)四、pg_user: (69)五、pg_roles: (69)六、pg_rules: (69)七、pg_settings: (70)PostgreSQL学习手册(客户端命令<一>) (70)零、口令文件: (70)PostgreSQL学习手册(客户端命令<二>) (75)七、pg_dump: (75)八、pg_restore: (77)PostgreSQL学习手册(SQL语言函数) (83)一、基本概念: (83)PostgreSQL学习手册(PL/pgSQL过程语言) (86)一、概述: (86)PostgreSQL学习手册(数据表)一、表的定义:对于任何一种关系型数据库而言,表都是数据存储的最核心、最基础的对象单元。

PostgreSQL学习手册

PostgreSQL学习手册

零、口令文件:在给出其它PostgreSQL客户端命令之前,我们需要先介绍一下PostgreSQL中的口令文件。

之所以在这里提前说明该文件,是因为我们在后面的示例代码中会大量应用该文件,从而保证我们的脚本能够自动化完成。

换句话说,如果在客户端命令执行时没有提供该文件,PostgreSQL的所有客户端命令均会被口令输入提示中断。

在当前用户的HOME目录下,我们需要手工创建文件名为 .pgpass的口令文件,这样就可以在我们连接PostgreSQL服务器时,客户端命令自动读取该文件已获得登录时所需要的口令信息。

该文件的格式如下:hostname:port:database:username:password以上数据是用冒号作为分隔符,总共分为五个字段,分别表示服务器主机名(IP)、服务器监听的端口号、登录访问的数据库名、登录用户名和密码,其中前四个字段都可以使用星号(*)来表示匹配任意值。

见如下示例:/> cat > .pgpass*:5432:postgres:postgres:123456CTRL+D#.pgpass文件的权限必须为0600,从而防止任何全局或者同组的用户访问,否则这个文件将被忽略。

/> chmod 0600 .pgpass在学习后面的客户端命令之前,我们需要根据自己的应用环境手工创建该文件,以便后面所有的示例代码都会用到该口令文件,这样它们就都可以以批处理的方式自动完成。

一、createdb:创建一个新的PostgreSQL数据库。

该命令的使用方式如下:createdb [option...] [dbname] [description]1. 命令行选项列表:选项说明-D(--tablespace=tablespace)指定数据库的缺省表空间。

-e(--echo)回显createdb生成的命令并且把它发送到服务器。

-E(--encoding=encoding)指定用于此数据库的字符编码方式。

PostgreSQL学习手册(常用数据类型)

PostgreSQL学习手册(常用数据类型)

PostgreSQL学习⼿册(常⽤数据类型)⼀、数值类型:下⾯是PostgreSQL所⽀持的数值类型的列表和简单说明:名字存储空间描述范围smallint 2 字节⼩范围整数-32768 到 +32767integer 4 字节常⽤的整数-2147483648 到 +2147483647bigint8 字节⼤范围的整数-9223372036854775808 到 9223372036854775807decimal变长⽤户声明精度,精确⽆限制numeric变长⽤户声明精度,精确⽆限制real 4 字节变精度,不精确 6 位⼗进制数字精度double8 字节变精度,不精确15 位⼗进制数字精度serial 4 字节⾃增整数 1 到 +2147483647bigserial8 字节⼤范围的⾃增整数 1 到 92233720368547758071. 整数类型:类型smallint、integer和bigint存储各种范围的全部是数字的数,也就是没有⼩数部分的数字。

试图存储超出范围以外的数值将导致⼀个错误。

常⽤的类型是integer,因为它提供了在范围、存储空间和性能之间的最佳平衡。

⼀般只有在磁盘空间紧张的时候才使⽤smallint。

⽽只有在integer的范围不够的时候才使⽤bigint,因为前者(integer)绝对快得多。

2. 任意精度数值:类型numeric可以存储最多1000位精度的数字并且准确地进⾏计算。

因此⾮常适合⽤于货币⾦额和其它要求计算准确的数量。

不过,numeric类型上的算术运算⽐整数类型或者浮点数类型要慢很多。

numeric字段的最⼤精度和最⼤⽐例都是可以配置的。

要声明⼀个类型为numeric的字段,你可以⽤下⾯的语法:NUMERIC(precision,scale)⽐如数字23.5141的精度为6,⽽刻度为4。

在⽬前的PostgreSQL版本中,decimal和numeric是等效的。

PostgreSQL学习手册:SQL语言函数

PostgreSQL学习手册:SQL语言函数

PostgreSQL学习手册:SQL语言函数第一篇:PostgreSQL学习手册:SQL语言函数PostgreSQL学习手册:SQL语言函数一、基本概念:SQL函数可以包含任意数量的查询,但是函数只返回最后一个查询(必须是SELECT)的结果。

在简单情况下,返回最后一条查询结果的第一行。

如果最后一个查询不返回任何行,那么该函数将返回NULL 值。

如果需要该函数返回最后一条SELECT语句的所有行,可以将函数的返回值定义为集合,即SETOF sometype。

SQL函数的函数体应该是用分号分隔的SQL语句列表,其中最后一条语句之后的分号是可选的。

除非函数声明为返回void,否则最后一条语句必须是SELECT。

事实上,在SQL函数中,不仅可以包含SELECT查询语句,也可以包含INSERT、UPDATE和DELETE等其他标准的SQL语句,但是和事物相关的语句不能包含其中,如BEGIN、COMMIT、ROLLBACK和SAVEPOINT等。

CREATE FUNCTION命令的语法要求函数体写成一个字符串文本。

通常来说,该文本字符串常量使用美元符($$)围住,如:CREATE FUNCTION clean_emp()RETURNS void AS $$DELETE FROM emp WHERE salary < 0;$$ LANGUAGE SQL;最后需要说明的是SQL函数中的参数,PostgreSQL定义$1表示第一个参数,$2为第二个参数并以此类推。

如果参数是复合类型,则可以使用点表示法,即$访问复合类型参数中的name字段。

需要注意的是函数参数只能用作数据值,而不能用于标识符,如:INSERT INTO mytable VALUES($1);--合法INSERT INTO $1 VALUES(42);--不合法(表名属于标示符之一)二、基本类型:最简单的SQL函数可能就是没有参数且返回基本类型的函数了,如:CREATE FUNCTION one()RETURNS integer AS $$SELECT 1 AS result;$$ LANGUAGE SQL;下面的例子声明了基本类型作为函数的参数。

PostgreSQL学习手册(数据库管理)

PostgreSQL学习手册(数据库管理)

PostgreSQL 学习手册(数据库管理一、概述:数据库可以被看成是SQL 对象(数据库对象的命名集合,通常而言,每个数据库对象(表、函数等只属于一个数据库。

不过对于部分系统表而言,如pg_database,是属于整个集群的。

更准确地说,数据库是模式的集合,而模式包含表、函数等SQL 对象。

因此完整的对象层次应该是这样的:服务器、数据库、模式、表或其他类型的对象。

在与数据库服务器建立连接时,该连接只能与一个数据库形成关联,不允许在一个会话中进行多个数据库的访问。

如以postgres 用户登录,该用户可以访问的缺省数据库为postgres ,在登录后如果执行下面的SQL 语句将会收到PostgreSQL 给出的相关错误信息。

postgres=# SELECT * FROM MyTest."MyUser".testtables;ERROR: cross-database references are not implemented:"otherdb.otheruser.sometable" LINE 1: select * from otherdb.otheruser.sometable在PostgreSQL 中,数据库在物理上是相互隔离的,对它们的访问控制也是在会话层次上进行的。

然而模式只是逻辑上的对象管理结构,是否能访问某个模式的对象是由权限系统来控制的。

执行下面的基于系统表的查询语句可以列出现有的数据库集合。

SELECT datname FROM pg_database;注:psql 应用程序的\l元命令和-l 命令行选项也可以用来列出当前服务器中已有的数据库。

二、创建数据库:在PostgreSQL 服务器上执行下面的SQL 语句可以创建数据库。

CREATE DATABASE db_name;在数据库成功创建之后,当前登录角色将自动成为此新数据库的所有者。

PostgreSQL基础教程说明书

PostgreSQL基础教程说明书

About the T utorialPostgreSQL is a powerful, open source object-relational database system. It has more than 15 years of active development and a proven architecture that has earned it a strong reputation for reliability, data integrity, and correctness.PostgreSQL runs on all major operating systems, including Linux, UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64), and Windows.This tutorial will give you quick start with PostgreSQL and make you comfortable with PostgreSQL programming.AudienceThis tutorial has been prepared for the beginners to help them understand the basic to advanced concepts related to PostgreSQL Database.PrerequisitesBefore you start practicing with various types of examples given in this reference, I'm making an assumption that you are already aware about what is database, especially RDBMS and what is a computer programming language.Copyright & DisclaimerCopyright 2017 by Tutorials Point (I) Pvt. Ltd.All the content and graphics published in this e-book are the property of Tutorials Point (I) Pvt. Ltd. The user of this e-book is prohibited to reuse, retain, copy, distribute or republish any contents or a part of contents of this e-book in any manner without written consent of the publisher.We strive to update the contents of our website and tutorials as timely and as precisely as possible, however, the contents may contain inaccuracies or errors. Tutorials Point (I) Pvt. Ltd. provides no guarantee regarding the accuracy, timeliness or completeness of our website or its contents including this tutorial. If you discover any errors on our website or inthistutorial,******************************************T able of ContentsAbout the Tutorial (i)Audience (i)Prerequisites (i)Copyright & Disclaimer (i)Table of Contents (ii)1.PostgreSQL – Overview (1)Brief History (1)Key Features of PostgreSQL (2)Procedural Languages Support (2)2.PostgreSQL – Environment Setup (3)Installing PostgreSQL on Linux/Unix (3)Installing PostgreSQL on Windows (4)Installing PostgreSQL on Mac (7)3.PostgreSQL – Syntax (11)The SQL Statement (11)PostgreSQL SQL commands (11)4.PostgreSQL – Data Type (35)Numeric Types (35)Monetary Types (36)Character Types (36)Binary Data Types (37)Date/Time Types (37)Boolean Type (37)Enumerated Type (38)Geometric Type (38)Network Address Type (38)Bit String Type (39)Text Search Type (39)UUID Type (39)XML Type (39)JSON Type (40)Array Type (40)Composite Types (41)Range Types (42)Object Identifier Types (43)Pseudo Types (43)5.PostgreSQL – CREATE Database (45)Using createdb Command (45)6.PostgreSQL – SELECT Database (48)Database SQL Prompt (48)OS Command Prompt (49)7.PostgreSQL – DROP Database (50)Using dropdb Command (51)8.PostgreSQL – CREATE Table (53)9.PostgreSQL – DROP Table (55)10.PostgreSQL – Schema (56)Syntax to Create Table in Schema (56)Syntax to Drop Schema (57)11.PostgreSQL – INSERT Query (58)12.PostgreSQL – SELECT Query (60)13.PostgreSQL – Operators (62)PostgreSQL Arithmetic Operators (62)PostgreSQL Comparison Operators (64)PostgreSQL Logical Operators (66)PostgreSQL Bit String Operators (69)14.PostgreSQL – Expressions (71)PostgreSQL – Boolean Expressions (71)PostgreSQL – Numeric Expression (72)PostgreSQL – Date Expressions (73)15.PostgreSQL – WHERE Clause (74)16.PostgreSQL – AND & OR Conjunctive Operators (79)The AND Operator (79)The OR Operator (80)17.PostgreSQL – UPDATE Query (82)18.PostgreSQL – DELETE Query (84)19.PostgreSQL – LIKE Clause (86)20.PostgreSQL – LIMIT Clause (89)21.PostgreSQL – ORDER BY Clause (91)22.PostgreSQL – GROUP BY (94)23.PostgreSQL – WITH Clause (97)Recursive WITH (97)24.PostgreSQL – HAVING Clause (101)25.PostgreSQL – DISTINCT Keyword (104)ADVANCED POSTGRESQL (107)26.PostgreSQL – CONSTRAINTS (108)NOT NULL Constraint (108)UNIQUE Constraint (109)PRIMARY KEY Constraint (109)FOREIGN KEY Constraint (110)CHECK Constraint (111)EXCLUSION Constraint (111)Dropping Constraints (112)27.PostgreSQL – JOINS (113)The CROSS JOIN (114)The INNER JOIN (115)The LEFT OUTER JOIN (116)The RIGHT OUTER JOIN (117)The FULL OUTER JOIN (117)28.PostgreSQL – UNIONS Clause (119)The UNION ALL Clause (121)29.PostgreSQL – NULL Values (123)30.PostgreSQL – ALIAS Syntax (126)31.PostgreSQL – TRIGGERS (129)Listing TRIGGERS (132)Dropping TRIGGERS (132)32.PostgreSQL – INDEXES (133)Index Types (133)The DROP INDEX Command (135)When Should Indexes be Avoided? (135)33.PostgreSQL – ALTER TABLE Command (136)34.PostgreSQL – TRUNCATE TABLE Command (139)35.PostgreSQL – VIEWS (140)Creating Views (140)Dropping Views (142)36.PostgreSQL – TRANSACTIONS (143)Transaction Control (143)The COMMIT Command (144)The ROLLBACK Command (144)37.PostgreSQL – LOCKS (146)DeadLocks (146)Advisory Locks (147)38.PostgreSQL – Sub Queries (148)Subqueries with the SELECT Statement (148)Subqueries with the INSERT Statement (149)Subqueries with the UPDATE Statement (150)Subqueries with the DELETE Statement (151)39.PostgreSQL – AUTO INCREMENT (153)40.PostgreSQL – PRIVILEGES (155)41.PostgreSQL – DATE/TIME Functions and Operators (158)42.PostgreSQL – Functions (166)43.PostgreSQL – Useful Functions (168)PostgreSQL – COUNT Function (168)PostgreSQL – MAX Function (169)PostgreSQL – MIN Function (171)PostgreSQL – AVG Function (172)PostgreSQL – SUM Function (173)PostgreSQL – Array Function (174)PostgreSQL – Numeric Function (175)PostgreSQL – STRING Function (185)POSTGRESQL INTERFACES (197)44.PostgreSQL – C/C++ Interface (198)Installation (198)C/C++ Interface APIs (199)Connecting To Database (200)Create a Table (201)INSERT Operation (202)SELECT Operation (204)UPDATE Operation (206)DELETE Operation (208)45.PostgreSQL – JAVA Interface (211)Installation (211)Connecting To Database (211)Create a Table (212)INSERT Operation (213)SELECT Operation (215)UPDATE Operation (217)DELETE Operation (219)46.PostgreSQL – PHP Interface (222)Installation (222)PHP Interface APIs (222)Connecting to Database (224)Create a Table (225)INSERT Operation (226)SELECT Operation (227)UPDATE Operation (228)DELETE Operation (230)47.PostgreSQL – Perl Interface (233)Installation (233)DBI Interface APIs (234)Connecting to Database (235)Create a Table (235)INSERT Operation (236)SELECT Operation (237)UPDATE Operation (239)DELETE Operation (240)48.PostgreSQL – Python Interface (243)Installation (243)Python psycopg2 module APIs (243)Connecting to Database (245)Create a Table (245)INSERT Operation (246)SELECT Operation (247)UPDATE Operation (248)DELETE Operation (249)PostgreSQL 7PostgreSQL is a powerful, open source object-relational database system. It has more than 15 years of active development phase and a proven architecture that has earned it a strong reputation for reliability, data integrity, and correctness.This tutorial will give you a quick start with PostgreSQL and make you comfortable with PostgreSQL programming.What is PostgreSQL?PostgreSQL (pronounced as post-gress-Q-L ) is an open source relational database management system (DBMS) developed by a worldwide team of volunteers. PostgreSQL is not controlled by any corporation or other private entity and the source code is available free of charge.A Brief History of PostgreSQLPostgreSQL, originally called Postgres, was created at UCB by a computer science professor named Michael Stonebraker. Stonebraker started Postgres in 1986 as a follow-up project to its predecessor, Ingres, now owned by Computer Associates.1. 1977-1985: A project called INGRES was developed.∙Proof-of-concept for relational databases ∙Established the company Ingres in 1980 ∙ Bought by Computer Associates in 19942. 1986-1994: POSTGRES∙ Development of the concepts in INGRES with a focus on object orientation and the query language - Quel∙The code base of INGRES was not used as a basis for POSTGRES ∙ Commercialized as Illustra (bought by Informix, bought by IBM)3. 1994-1995: Postgres95∙Support for SQL was added in 1994 ∙Released as Postgres95 in 1995 ∙Re-released as PostgreSQL 6.0 in 1996 ∙ Establishment of the PostgreSQL Global Development Team1.PostgreSQLKey Features of PostgreSQLPostgreSQL runs on all major operating systems, including Linux, UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64), and Windows. It supports text, images, sounds, and video, and includes programming interfaces for C / C++, Java, Perl, Python, Ruby, Tcl and Open Database Connectivity (ODBC).PostgreSQL supports a large part of the SQL standard and offers many modern features including the following:∙Complex SQL queries∙SQL Sub-selects∙Foreign keys∙Trigger∙Views∙Transactions∙Multiversion concurrency control (MVCC)∙Streaming Replication (as of 9.0)∙Hot Standby (as of 9.0)You can check official documentation of PostgreSQL to understand the above-mentioned features. PostgreSQL can be extended by the user in many ways. For example by adding new: ∙Data types∙Functions∙Operators∙Aggregate functions∙Index methodsProcedural Languages SupportPostgreSQL supports four standard procedural languages, which allows the users to write their own code in any of the languages and it can be executed by PostgreSQL database server. These procedural languages are - PL/pgSQL, PL/Tcl, PL/Perl and PL/Python. Besides, other non-standard procedural languages like PL/PHP, PL/V8, PL/Ruby, PL/Java, etc., are also supported.8PostgreSQL 9 To start understanding the PostgreSQL basics, first let us install the PostgreSQL. This chapter explains about installing the PostgreSQL on Linux, Windows and Mac OS platforms. Installing PostgreSQL on Linux/UnixFollow the given steps to install PostgreSQL on your Linux machine. Make sure you are logged in as root before you proceed for the installation.∙ Pick the version number of PostgreSQL you want and, as exactly as possible, the platform you want from EnterpriseDB∙I downloaded postgresql-9.2.4-1-linux-x64.run for my 64-bit CentOS-6 machine. Now, let us execute it as follows:∙ Once you launch the installer, it asks you a few basic questions like location of the installation, password of the user who will use database, port number, etc. So keep all of them at their default values except password, which you can provide password as per your choice. It will install PostgreSQL at your Linux machine and will display the following message:∙ Follow the following post-installation steps to create your database:2.10∙You can start/restart postgres server in case it is not running, using thefollowing command:∙If your installation was correct, you will have PotsgreSQL prompt test=# as shown above.Installing PostgreSQL on WindowsFollow the given steps to install PostgreSQL on your Windows machine. Make sure you have turned Third Party Antivirus off while installing.∙Pick the version number of PostgreSQL you want and, as exactly as possible, the platform you want from EnterpriseDB∙I downloaded postgresql-9.2.4-1-windows.exe for my Windows PC running in 32-bit mode, so let us run postgresql-9.2.4-1-windows.exe as administrator to install PostgreSQL. Select the location where you want to install it. By default, it is installed within Program Files folder.11The next step of the installation process would be to select the directory where your data would be stored. By default, it is stored under the "data" directory.12Next, the setup asks for password, so you can use your favorite password.13The next step; keep the port as default.14∙ In the next step, when asked for "Locale", I selected "English, United States".∙It takes a while to install PostgreSQL on your system. On completion of the installation process, you will get the following screen. Uncheck the checkbox and click the Finish button.After the installation process is completed, you can access pgAdmin III, StackBuilder and PostgreSQL shell from your Program Menu under PostgreSQL 9.2.Installing PostgreSQL on MacFollow the given steps to install PostgreSQL on your Mac machine. Make sure you are logged in as administrator before you proceed for the installation.∙∙I downloaded postgresql-9.2.4-1-osx.dmg for my Mac OS running with OS X version 10.8.3. Now, let us open the dmg image in finder and just double click it, which will give you PostgreSQL installer in the following window:15∙Next, click the postgres-9.2.4-1-osx icon, which will give a warning message. Accept the warning and proceed for further installation. It will ask for the administrator password as seen in the following window:∙Enter the password, proceed for the installation, and after this step, restart your Mac machine. If you do not see the following window, start your installation once again.16Once you launch the installer, it asks you a few basic questions like location of the installation, password of the user who will use database, port number etc. Therefore, keep all of them at their default values except the password, which you can provide as per your choice. It will install PostgreSQL in your Mac machine in the Application folder which you can check:17Now, you can launch any of the program to start with. Let us start with SQL Shell.When you launch SQL Shell, just use all the default values it displays except, enter your password, which you had selected at the time of installation. If everything goes fine, then you will be inside postgres database and a postgress#prompt will be displayed as shown below:18Congratulations Now you have your environment ready to start with PostgreSQL database programming.19PostgreSQL20This chapter provides a list of the PostgreSQL SQL commands, followed by the precise syntax rules for each of these commands. This set of commands is taken from the psql command-line tool. Now that you have Postgres installed, open the psql as: Program Files > PostgreSQL 9.2 > SQL Shell(psql).Using psql, you can generate a complete list of commands by using the \help command. For the syntax of a specific command, use the following command: The SQL StatementAn SQL statement is comprised of tokens where each token can represent either a keyword, identifier, quoted identifier, constant, or special character symbol. The table given below uses a simple SELECT statement to illustrate a basic, but complete, SQL statement and its components.PostgreSQL SQL commandsABORTAbort the current transaction. ALTER AGGREGATEChange the definition of an aggregate function. 3.ALTER CONVERSIONChange the definition of a conversion.ALTER DATABASEChange a database specific parameter.ALTER DOMAINChange the definition of a domain specific parameter.ALTER FUNCTIONChange the definition of a function.ALTER GROUPChange a user group.21ALTER INDEXChange the definition of an index.ALTER LANGUAGEChange the definition of a procedural language.ALTER OPERATORChange the definition of an operator.ALTER OPERATOR CLASSChange the definition of an operator class.ALTER SCHEMAChange the definition of a schema.ALTER SEQUENCEChange the definition of a sequence generator.ALTER TABLEChange the definition of a table.Where action is one of the following lines:ALTER TABLESPACE23Change the definition of a tablespace.ALTER TRIGGERChange the definition of a trigger.ALTER TYPEChange the definition of a type.ALTER USERChange a database user account.Where option can be:ANALYZECollect statistics about a database.BEGINStart a transaction block.24Where transaction_mode is one of:CHECKPOINTForce a transaction log checkpoint.CLOSEClose a cursor.CLUSTERCluster a table according to an index.COMMENTDefine or change the comment of an object.25COMMITCommit the current transaction.COPYCopy data between a file and a table.CREATE AGGREGATEDefine a new aggregate function.CREATE CASTDefine a new cast.27CREATE CONSTRAINT TRIGGERDefine a new constraint trigger.CREATE CONVERSIONDefine a new conversion.CREATE DATABASECreate a new database.CREATE DOMAINDefine a new domain.28Where constraint is:CREATE FUNCTIONDefine a new function.CREATE GROUPDefine a new user group.CREATE INDEXDefine a new index.29CREATE LANGUAGEDefine a new procedural language.CREATE OPERATORDefine a new operator.CREATE OPERATOR CLASSDefine a new operator class.30CREATE RULEDefine a new rewrite rule.CREATE SCHEMADefine a new schema.CREATE SEQUENCEDefine a new sequence generator.Define a new table.31Where column_constraint is:And table_constraint is:32End of ebook previewIf you liked what you saw…Buy it from our store @ https://33。

PostgreSQL学习手册(PLpgSQL过程语言)

PostgreSQL学习手册(PLpgSQL过程语言)

PostgreSQL学习手册(PL/pgSQL过程语言)一、概述:PL/pgSQL函数在第一次被调用时,其函数内的源代码(文本)将被解析为二进制指令树,但是函数内的表达式和SQL命令只有在首次用到它们的时候,PL/pgSQL解释器才会为其创建一个准备好的执行规划,随后对该表达式或SQL命令的访问都将使用该规划。

如果在一个条件语句中,有部分SQL命令或表达式没有被用到,那么PL/pgSQL解释器在本次调用中将不会为其准备执行规划,这样的好处是可以有效地减少为PL/pgSQL函数里的语句生成分析和执行规划的总时间,然而缺点是某些表达式或SQL命令中的错误只有在其被执行到的时候才能发现。

由于PL/pgSQL在函数里为一个命令制定了执行计划,那么在本次会话中该计划将会被反复使用,这样做往往可以得到更好的性能,但是如果你动态修改了相关的数据库对象,那么就有可能产生问题,如:CREATE FUNCTION populate() RETURNS integer AS $$DECLARE-- 声明段BEGINPERFORM my_function();END;$$ LANGUAGE plpgsql;在调用以上函数时,PERFORM语句的执行计划将引用my_function对象的OID。

在此之后,如果你重建了my_function函数,那么populate函数将无法再找到原有my_function函数的OID。

要解决该问题,可以选择重建populate函数,或者重新登录建立新的会话,以使PostgreSQL重新编译该函数。

要想规避此类问题的发生,在重建my_function时可以使用CREA TE OR REPLACE FUNCTION命令。

鉴于以上规则,在PL/pgSQL里直接出现的SQL命令必须在每次执行时均引用相同的表和字段,换句话说,不能将函数的参数用作SQL命令的表名或字段名。

如果想绕开该限制,可以考虑使用PL/pgSQL中的EXECUTE语句动态地构造命令,由此换来的代价是每次执行时都要构造一个新的命令计划。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、概述:PL/pgSQL函数在第一次被调用时,其函数内的源代码(文本)将被解析为二进制指令树,但是函数内的表达式和SQL命令只有在首次用到它们的时候,PL/pgSQL解释器才会为其创建一个准备好的执行规划,随后对该表达式或SQL命令的访问都将使用该规划。

如果在一个条件语句中,有部分SQL命令或表达式没有被用到,那么PL/pgSQL解释器在本次调用中将不会为其准备执行规划,这样的好处是可以有效地减少为PL/pgSQL函数里的语句生成分析和执行规划的总时间,然而缺点是某些表达式或SQL命令中的错误只有在其被执行到的时候才能发现。

由于PL/pgSQL在函数里为一个命令制定了执行计划,那么在本次会话中该计划将会被反复使用,这样做往往可以得到更好的性能,但是如果你动态修改了相关的数据库对象,那么就有可能产生问题,如: CREATE FUNCTION populate() RETURNS integer AS $$DECLARE-- 声明段BEGINPERFORM my_function();END;$$ LANGUAGE plpgsql;在调用以上函数时,PERFORM语句的执行计划将引用my_function对象的OID。

在此之后,如果你重建了my_function函数,那么populate函数将无法再找到原有my_function函数的OID。

要解决该问题,可以选择重建populate函数,或者重新登录建立新的会话,以使PostgreSQL重新编译该函数。

要想规避此类问题的发生,在重建my_function时可以使用CREATE OR REPLACE FUNCTION命令。

鉴于以上规则,在PL/pgSQL里直接出现的SQL命令必须在每次执行时均引用相同的表和字段,换句话说,不能将函数的参数用作SQL命令的表名或字段名。

如果想绕开该限制,可以考虑使用PL/pgSQL 中的EXECUTE语句动态地构造命令,由此换来的代价是每次执行时都要构造一个新的命令计划。

使用PL/pgSQL函数的一个非常重要的优势是可以提高程序的执行效率,由于原有的SQL调用不得不在客户端与服务器之间反复传递数据,这样不仅增加了进程间通讯所产生的开销,而且也会大大增加网络IO的开销。

二、PL/pgSQL的结构:PL/pgSQL是一种块结构语言,函数定义的所有文本都必须在一个块内,其中块中的每个声明和每条语句都是以分号结束,如果某一子块在另外一个块内,那么该子块的END关键字后面必须以分号结束,不过对于函数体的最后一个END关键字,分号可以省略,如:[ <<label>> ][ DECLARE declarations ]BEGINstatementsEND [ label ];在PL/pgSQL中有两种注释类型,双破折号(--)表示单行注释。

/* */表示多行注释,该注释类型的规则等同于C语言中的多行注释。

在语句块前面的声明段中定义的变量在每次进入语句块(BEGIN)时都会将声明的变量初始化为它们的缺省值,而不是每次函数调用时初始化一次。

如:CREATE FUNCTION somefunc() RETURNS integer AS $$DECLAREquantity integer := 30;BEGINRAISE NOTICE 'Quantity here is %', quantity; --在这里的数量是30quantity := 50;---- 创建一个子块-- DECLAREquantity integer := 80;BEGINRAISE NOTICE 'Quantity here is %', quantity; --在这里的数量是80END;RAISE NOTICE 'Quantity here is %', quantity; --在这里的数量是50RETURN quantity;END;$$ LANGUAGE plpgsql;#执行该函数以进一步观察其执行的结果。

postgres=# select somefunc();NOTICE: Quantity here is 30NOTICE: Quantity here is 80NOTICE: Quantity here is 50somefunc----------50(1 row)最后需要说明的是,目前版本的PostgreSQL并不支持嵌套事务,函数中的事物总是由外层命令(函数的调用者)来控制的,它们本身无法开始或提交事务。

三、声明:所有在块里使用的变量都必须在块的声明段里先进行声明,唯一的例外是FOR循环里的循环计数变量,该变量被自动声明为整型。

变量声明的语法如下:variable_name [ CONSTANT ] variable_type [ NOT NULL ] [ { DEFAULT | := } expression ];1). SQL中的数据类型均可作为PL/pgSQL变量的数据类型,如integer、varchar和char等。

2). 如果给出了DEFAULT子句,该变量在进入BEGIN块时将被初始化为该缺省值,否则被初始化为SQL空值。

缺省值是在每次进入该块时进行计算的。

因此,如果把now()赋予一个类型为timestamp的变量,那么该变量的缺省值将为函数实际调用时的时间,而不是函数预编译时的时间。

3). CONSTANT选项是为了避免该变量在进入BEGIN块后被重新赋值,以保证该变量为常量。

4). 如果声明了NOT NULL,那么赋予NULL数值给该变量将导致一个运行时错误。

因此所有声明为NOT NULL的变量也必须在声明时定义一个非空的缺省值。

1. 函数参数的别名:传递给函数的参数都是用$1、$2这样的标识符来表示的。

为了增加可读性,我们可以为其声明别名。

之后别名和数字标识符均可指向该参数值,见如下示例:1). 在函数声明的同时给出参数变量名。

CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $$BEGINRETURN subtotal * 0.06;END;$$ LANGUAGE plpgsql;2). 在声明段中为参数变量定义别名。

CREATE FUNCTION sales_tax(REAL) RETURNS real AS $$DECLAREsubtotal ALIAS FOR $1;BEGINRETURN subtotal * 0.06;END;$$ LANGUAGE plpgsql;3). 对于输出参数而言,我们仍然可以遵守1)和2)中的规则。

CREATE FUNCTION sales_tax(subtotal real, OUT tax real) AS $$BEGINtax := subtotal * 0.06;END;$$ LANGUAGE plpgsql;4). 如果PL/pgSQL函数的返回类型为多态类型(anyelement或anyarray),那么函数就会创建一个特殊的参数:$0。

我们仍然可以为该变量设置别名。

CREATE FUNCTION add_three_values(v1 anyelement, v2 anyelement, v3 anyelement) RETURNS anyelement AS $$DECLAREresult ALIAS FOR $0;BEGINresult := v1 + v2 + v3;RETURN result;END;$$ LANGUAGE plpgsql;2. 拷贝类型:见如下形式的变量声明:variable%TYPE%TYPE表示一个变量或表字段的数据类型,PL/pgSQL允许通过该方式声明一个变量,其类型等同于variable或表字段的数据类型,见如下示例:user_id er_id%TYPE;在上面的例子中,变量user_id的数据类型等同于users表中user_id字段的类型。

通过使用%TYPE,一旦引用的变量类型今后发生改变,我们也无需修改该变量的类型声明。

最后需要说明的是,我们可以在函数的参数和返回值中使用该方式的类型声明。

3. 行类型:见如下形式的变量声明:name table_name%ROWTYPE;name composite_type_name;table_name%ROWTYPE表示指定表的行类型,我们在创建一个表的时候,PostgreSQL也会随之创建出一个与之相应的复合类型,该类型名等同于表名,因此,我们可以通过以上两种方式来声明行类型的变量。

由此方式声明的变量,可以保存SELECT返回结果中的一行。

如果要访问变量中的某个域字段,可以使用点表示法,如rowvar.field,但是行类型的变量只能访问自定义字段,无法访问系统提供的隐含字段,如OID等。

对于函数的参数,我们只能使用复合类型标识变量的数据类型。

最后需要说明的是,推荐使用%ROWTYPE的声明方式,这样可以具有更好的可移植性,因为在Oracle的PL/SQL中也存在相同的概念,其声明方式也为%ROWTYPE。

见如下示例:CREATE FUNCTION merge_fields(t_row table1) RETURNS text AS $$DECLAREt2_row table2%ROWTYPE;BEGINSELECT * INTO t2_row FROM table2 WHERE id = 1 limit 1;RETURN t_row.f1 || t2_row.f3 || t_row.f5 || t2_row.f7;END;$$ LANGUAGE plpgsql;4. 记录类型:见如下形式的变量声明:name RECORD;记录变量类似于行类型变量,但是它们没有预定义的结构,只能通过SELECT或FOR命令来获取实际的行结构,因此记录变量在被初始化之前无法访问,否则将引发运行时错误。

注:RECORD不是真正的数据类型,只是一个占位符。

四、基本语句:1. 赋值:PL/pgSQL中赋值语句的形式为:identIFier := expression,等号两端的变量和表达式的类型或者一致,或者可以通过PostgreSQL的转换规则进行转换,否则将会导致运行时错误,见如下示例:user_id := 20;tax := subtotal * 0.06;2. SELECT INTO:通过该语句可以为记录变量或行类型变量进行赋值,其表现形式为:SELECT INTO target select_expressions FROM ...,该赋值方式一次只能赋值一个变量。

相关文档
最新文档