您的位置:首页 >> 数据库 >> PostgreSQL >> 正文
PostgreSQL RSS
 

PostgreSQL数据库学习手册之扩展的 SQL:函数

http://www.rdxx.com 05年08月24日 10:00 网络 我要投稿

9.1. 介绍

PostgreSQL 提供四种类型的函数:

*

查询语言函数(用 SQL 写的函数)
*

过程语言函数(用诸如 PL/Tcl 或 PL/pgSQL 这样的语言写的函数)
*

内部函数
*

C 语言函数

每种函数都可以以一个基本类型或一个复合类型或是两者的某种组合作为参数. 另外,每种函数都可以返回 一个基本类型或一个复合类型值.定义 SQL 函数更容易些,所以我们将从这里开始.本章的例子还可以在 funcs.sql 和 funcs.c 里找到.

综观全章,如果你阅读一下 CREATE FUNCTION 的手册页应该会对你理解本章的例子很有帮助.

9.2. 查询语言(SQL)函数

SQL 函数执行一个任意 SQL 查询的列表,返回列表里最后一个查询的结果。 它必须是一条 SELECT.在比较简单的情况下(非集合的情况), 返回最后一条查询结果的第一行.(请记住多行结果的"第一行" 是不明确的,除非你用 ORDER BY 对结果排序.) 如果最后一个查询碰巧不返回行,那么返回 NULL.

另外,一个 SQL 函数可以声明为返回一个集合,方法是把该函数的 返回类型声明为 SETOF sometype. 这个时候最后一条查询结果的所有行都会被返回.更多的细节在下面讲.

SQL 函数的函数体应该是一个用分号分隔的一条或多条 SQL 语句的列表. 请注意,因为 CREATE FUNCTION 命令的语法要求 函数体要封闭在单引号里面,所以在函数体中使用的单引号 (') 必须逃逸,方法是写两个单引号(') 或者 在需要逃逸的单引号之前放一个反斜扛 (\').

SQL 函数的参数在查询里可以用 $n 语法引用: $1指第一个参数,$2 指第二个参数,以此类推。 如果参数是 复合类型,那么可以用点表示法, 例如,"$1.emp",访问参数里的字段。
9.2.1. 例子

看看下面这个简单的 SQL 函数的例子, 它将用于对一个银行帐号做扣款(借记消费 debit)动作:

CREATE FUNCTION tp1 (integer, numeric) RETURNS integer AS '
UPDATE bank
SET balance = balance - $2
WHERE acctountno = $1;
SELECT 1;'
LANGUAGE 'sql';


一个用户可以象下面这样用这个函数给帐户 17 扣款 $100.00:

SELECT tp1( 17,100.0);


实际上我们可能喜欢函数有一个比常量 "1" 更有用一些的结果. 所以更有可能的定义是

CREATE FUNCTION tp1 (integer, numeric) RETURNS numeric AS '
UPDATE bank
SET balance = balance - $2
WHERE accountno = $1;
SELECT balance FROM bank WHERE accountno = $1;
' LANGUAGE SQL;

它修改余额并返回新的余额.

SQL 里面的任何命令集都可以打成一个包, 做成一个函数.这些命令可以包含数据修改(也就是说, INSERT,UPDATE, 和DELETE)以及 SELECT 查询. 不过,最后的命令必须是一条返回函数声明的返回类型的 SELECT. 另外,如果你想定义那些执行动作但是不返回有用的数值的 SQL 函数, 你可以把它定义成返回 void。这时候它不能以 SELECT 为最后一条语句。比如:

共5页  第1页 第2页 第3页 第4页 第5页


 
 
标签: 学习手册 , 扩展 , PostgreSQL , 函数 , 数据库 , SQL , 数据 , 学习 , 手册 , POST 打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站