PostgreSQL创建函数(CREATE FUNCTION)
NameCREATE FUNCTION -- 定义一个新函数Synopsis
CREATE [ OR REPLACE ] FUNCTION name( [ [argmode] [argname]argtype[ { DEFAULT | = }default_expr] [,...] ] ) [ RETURNSrettype | RETURNS TABLE (column_namecolumn_type[,...] ) ] { LANGUAGElang_name | WINDOW | IMMUTABLE | STABLE | VOLATILE | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | COSTexecution_cost | ROWSresult_rows | SETconfiguration_parameter{ TOvalue| =value| FROM CURRENT } | AS 'definition' | AS 'obj_file','link_symbol' } ... [ WITH (attribute[,...] ) ] 描述CREATE FUNCTION 定义一个新的函数。 CREATE OR REPLACE FUNCTION 将要么创建一个新函数,要么替换现有的定义。 如果包含了一个模式名,那么函数就在指定的模式中创建。否则它会在当前模式中创建。新函数的名字不能和同一个模式中的任何带有同样参数类型的函数同名。不过,参数类型不同的函数可以同名(这叫做重载)。 要更新一个现有函数的定义,使用 CREATE OR REPLACEFUNCTION。我们不能用这个方法修改一个函数的名字或者参数类型(如果你这么干,那么你就会创建一个新的,不同的函数)。同样,CREATEOR REPLACE FUNCTION也不会允许你修改一个现有函数的返回类型。要做这些事情,你必须删除并重新创建函数。(如果使用 OUT 参数,那就意味着除了删除函数,你不能修改任何 OUT 参数的类型或者名字。) 如果你删除然后重建一个函数,新函数和旧的将是不同的实体;你就需要删除现有引用了老函数的规则,视图,触发器等等。 使用CREATE OR REPLACE FUNCTION可以在不破坏引用该函数的对象的前提下修改函数定义。 创建这个函数的用户成为函数的所有者。 参数
属性名是大小写无关的。 这里是一些简单的例子,用于帮助你开始掌握这个命令。 CREATE FUNCTION add(integer,integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; 用 PL/pgSQL 自增一个整数,利用参数名: CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$ BEGIN RETURN i + 1; END; $$ LANGUAGE plpgsql; 返回一个包含多个输出参数的记录: CREATE FUNCTION dup(in int,out f1 int,out f2 text) AS $$ SELECT $1,CAST($1 AS text) || ' is text' $$ LANGUAGE SQL; SELECT * FROM dup(42); 你可以通过命名明确的复合类型的方法冗长地干同样的事情: CREATE TYPE dup_result AS (f1 int,f2 text); CREATE FUNCTION dup(int) RETURNS dup_result AS $$ SELECT $1,CAST($1 AS text) || ' is text' $$ LANGUAGE SQL;
SELECT * FROM dup(42); 兼容性在 SQL:1999 里定义了一个CREATE FUNCTIONPostgreSQL的和它类似但是不兼容。这个属性是不可移植的,可以使用的不同语言也是如此。 为了和一些其他的数据库系统兼容,argmode 可以在argname之前或者之后写,但是只有第一种访法是标准兼容的。 http://www.postgresql.org/docs/9.1/static/sql-createfunction.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |