使用 CREATE LANGUAGE, 一个PostgreSQL 用户可以在 PostgreSQL里注册一个新的语言. 因而,函数和触发器过程可以用这种新语言定义.要注册新 语言用户必须具有 PostgreSQL 超级用户权限.
CREATE LANGUAGE 将该语言的名字和一个调用句柄 关联起来,而该调用句柄负责执行该语言书写的函数. 请参考 PostgreSQL 7.3 程序员手册 获取有关语言调用句柄的 更多信息.
请注意过程语言是对每个独立的数据库而言是自己的. 要让一种语言缺省时可以为所有数据库获得,那你应该把它安装到 template1 数据库里.
TRUSTED 说明对该语言的调用句柄是安全的; 也就是说,它不会提供给非特权用户任何绕过访问限制的能力. 如果忽略这个关键字,只有具有 PostgreSQL 超级用户权限的人可以使用这个语言创建新的函数.
这是个没有用的字.
新的过程化语言的名称.语言名是大小写无关的. 一个过程化语言不能覆盖 PostgreSQL内置的语言.
出于向下兼容的原因,这个名字可以用单引号包围.
call_handler 是一个以前注册过的函数的名字,该函数将被调用来执行这门过程语言写的 函数.过程语言的调用句柄必须用一种编译语言书写,比如 C,调用风格必须 是版本 1 的调用风格,并且在 PostgreSQL 里注册为不接受参数并且返回 language_handler 类型的函数, language_handler 是用于将函数声明为调用句柄的占位符。
valfunction 是一个 已经注册的函数的名字,在用改语言创建新函数的时候将调用它来校验 新函数。如果没有声明校验函数,那么建立新函数的时候就不会检查它。 校验函数必须接受一个类型为 oid 的参数,它是将要创建 的函数的 OID,并且通常会返回 void。
校验函数通常会检查函数体,看看看有没有语法错误,但是它也可以 查看函数的其它属性,比如该语言是否不能处理某种参数类型。要发出 一个错误,校验函数应该用 elog() 函数。 该函数的返回值将被忽略。
这条命令通常不应该由用户直接执行. 对于 PostgreSQL 版本里提供的过程语言, 我们应该使用 createlang 脚本, 它将为我们安装正确的调用句柄. (createlang 也会在内部调用 CREATE LANGUAGE.)
在 PostgreSQL 版本 7.3 之前, 我们必须声明句柄函数返回占位类型 opaque,而不是 language_handler。 为了支持装载旧的转储文件,CREATE LANGUAGE 还将接受声明为 返回 opaque 的函数,但是它会发出一条 NOTICE 并且把函数 声明返回类型改为 language_handler。
使用 CREATE FUNCTION 命令创建新函数.
使用 DROP LANGUAGE,或者更好是 droplang 脚本删除一个过程语言.
系统表 pg_language 记录了更多有关 当前安装的过程语言的信息.
Table "pg_language" Attribute | Type | Modifier ---------------+-----------+---------- lanname | name | lanispl | boolean | lanpltrusted | boolean | lanplcallfoid | oid | lanvalidator | oid | lanacl | aclitem[] | lanname | lanispl | lanpltrusted | lanplcallfoid | lanvalidator | lanacl -------------+---------+--------------+---------------+--------------+-------- internal | f | f | 0 | 2246 | c | f | f | 0 | 2247 | sql | f | t | 0 | 2248 | {=U}
目前,一种过程语言创建之后它的定义就不能再更改.
要使用一种过程语言,用户必须被赋予 USAGE 权限. 如果该语言已知是可信的,那么 createlang 程序自动给每个人赋予权限.