codecamp

PostgreSQL 综述

42.1.1. 使用PL/pgSQL的优点
42.1.2. 支持的参数和结果数据类型

PL/pgSQL是一种用于PostgreSQL数据库系统的可载入的过程语言。PL/pgSQL的设计目标是创建一种这样的可载入过程语言

  • 可以被用来创建函数和触发器过程,

  • SQL语言增加控制结构,

  • 可以执行复杂计算,

  • 继承所有用户定义类型、函数和操作符,

  • 可以被定义为受服务器信任,

  • 便于使用。

PL/pgSQL创建的函数可以被用在任何可以使用内建函数的地方。例如,可以创建复杂条件的计算函数并且后面用它们来定义操作符或把它们用于索引表达式。

PostgreSQL 9.0 和以后的版本中,PL/pgSQL是默认被安装的。但是它仍然是一种可载入模块,因此特别关注安全性的管理员可以选择移除它。

42.1.1. 使用PL/pgSQL的优点

SQLPostgreSQL和大多数其他关系数据库用作查询语言。它是可移植的并且容易学习。但是每一个SQL语句必须由数据库服务器单独执行。

这意味着你的客户端应用必须发送每一个查询到数据库服务器、等待它被处理、接收并处理结果、做一些计算,然后发送更多查询给服务器。如果你的客户端和数据库服务器不在同一台机器上,所有这些会引起进程间通信并且将带来网络负担。

通过PL/pgSQL,你可以将一整块计算和一系列查询分组在数据库服务器内部,这样就有了一种过程语言的能力并且使 SQL 更易用,但是节省了相当多的客户端/服务器通信开销。

  • 客户端和服务器之间的额外往返通信被消除

  • 客户端不需要的中间结果不必被整理或者在服务器和客户端之间传送

  • 多轮的查询解析可以被避免

与不使用存储函数的应用相比,这能够导致可观的性能提升。

还有,通过PL/pgSQL你可以使用 SQL 中所有的数据类型、操作符和函数。

42.1.2. 支持的参数和结果数据类型

PL/pgSQL编写的函数可以接受服务器支持的任何标量或数组数据类型作为参数,并且它们能够返回任何这些类型的结果。它们也能接受或返回任何用名称指定的组合类型(行类型)。还可以声明一个PL/pgSQL函数为接受record,这表示任意组合类型都将作为输入,或者声明为返回record,表示结果是一种行类型,它的列由调用查询中的说明确定(如 第 7.2.1.4 节中所讨论)。

PL/pgSQL函数可以通过使用VARIADIC标记被声明为接受数量不定的参数。如第 37.5.5 节中所讨论的,它的工作方式和 SQL 函数一样。

PL/pgSQL函数也可以声明为接受和返回 第 37.2.5 节中描述的多态类型, 从而允许函数处理的实际数据类型发生变化 从呼叫到呼叫。 示例出现在第 42.3.1 节中。

PL/pgSQL函数还能够被声明为返回一个任意(可作为一个单一实例返回的)数据类型的集合(或表)。这样的一个函数通过为结果集的每个期望元素执行RETURN NEXT来产生输出,或者通过使用RETURN QUERY来输出一个查询计算的结果。

最后,如果一个PL/pgSQL函数没有可用的返回值,它可以被声明为返回void(另外一种选择是,在那种情况下它可以被写作一个过程)。

PL/pgSQL函数也能够被声明为用输出参数代替返回类型的一个显式说明。这没有为该语言增加任何基础功能,但是它常常很方便,特别是对于要返回多个值的情况。RETURNS TABLE符号也可以被用来替代RETURNS SETOF

第 42.3.1 节第 42.6.1 节中有详细的例子。


PostgreSQL PL/pgSQL — SQL过程语言
PostgreSQL PL/pgSQL的结构
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

PostgreSQL SQL语言

PostgreSQL 服务器管理

PostgreSQL 客户端接口

PostgreSQL 服务器编程

PostgreSQL 参考

PostgreSQL 内部

PostgreSQL 附录

PostgreSQL 参考书目

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }