在数据库中创建用户定义的 SQL 函数。
CREATE [ OR REPLACE | TEMPORARY ] FUNCTION [ owner.]function-name ( [ parameter, ... ] ) RETURNS data-type [ SQL SECURITY { INVOKER | DEFINER } ] [ ON EXCEPTION RESUME ] [ [ NOT ] DETERMINISTIC ] compound-statement | AS tsql-compound-statement
parameter : [ IN ] parameter-name data-type [ DEFAULT expression ]
tsql-compound-statement : sql-statement sql-statement ...
参数名必须符合数据库标识符规则。它们必须是有效的 SQL 数据类型,且必须以关键字 IN 作为前缀,以表明参数是为函数提供值的表达式。但在缺省情况下,函数参数是 IN。
执行函数时,不必指定所有参数。如果在 CREATE FUNCTION 语句中提供 DEFAULT 值,则会为缺少的参数指派缺省值。如果调用程序既未提供参数又未设置缺省值,则会给出错误。
OR REPLACE 子句 指定 CREATE OR REPLACE FUNCTION 将创建一个新函数或替换同名的现有函数。替换函数时会更改函数的定义,但保留现有权限。
不能将 OR REPLACE 子句与临时函数一起使用。
TEMPORARY 关键字 如果指定 CREATE TEMPORARY FUNCTION,则将意味着该函数仅对创建它的连接可见,并在删除该连接时随之自动删除。也可以显式删除临时函数。无法在临时函数上执行 ALTER、GRANT 或 REVOKE,而且与其它函数不同,临时函数不会在目录或事务日志中予以记录。
临时函数使用其创建者(当前用户)或指定所有者的权限进行执行。可在以下情况下为临时函数指定所有者:
临时函数是在永久存储过程中创建的
临时函数与永久存储过程的所有者相同
要删除临时函数的所有者,必须首先删除该临时函数。
临时函数可在连接到只读数据库时加以创建和删除。
不能将 OR REPLACE 子句与临时函数一起使用。
RETURNS 子句 使用 RETURNS 子句指定函数结果的数据类型。
SQL SECURITY 子句 SQL SECURITY 子句定义该函数是作为 INVOKER(调用该函数的用户)执行还是作为 DEFINER(拥有该函数的用户)执行。缺省值为 DEFINER。
[ NOT ] DETERMINISTIC 子句 使用此子句指明函数是确定型函数还是非确定型函数。如果忽略此子句,便没有指定函数的确定型行为(缺省设置)。
如果将某个函数声明为 DETERMINISTIC,则在每次使用同一组参数调用该函数时,应返回同一个值。
如果将某个函数声明为 NOT DETERMINISTIC,则无法保证对于同一组参数会返回同一个值。声明为 NOT DETERMINISTIC 的函数每次在查询中调用时都将重新求值。如果已知给定一组参数的函数结果可以不同,则必须使用此子句。
另外,对于具有副作用(如修改基础数据)的函数,应将其声明为 NOT DETERMINISTIC。例如,应将生成主键值且用于 INSERT...SELECT 语句的函数声明为 NOT DETERMINISTIC:
CREATE FUNCTION keygen( increment INTEGER ) RETURNS INTEGER NOT DETERMINISTIC BEGIN DECLARE keyval INTEGER; UPDATE counter SET x = x + increment; SELECT counter.x INTO keyval FROM counter; RETURN keyval END INSERT INTO new_table SELECT keygen(1), ... FROM old_table; |
如果函数对给定输入参数总是返回相同的值,则该函数可以声明为 DETERMINISTIC。
compound-statement 一组用 BEGIN 和 END 括起来的 SQL 语句,中间用分号分隔。
tsql-compound-statement 一批 Transact-SQL 语句。
CREATE FUNCTION 语句在数据库中创建函数。通过指定所有者名称,可以为其他用户创建函数。根据权限,可通过与其它非集合函数完全相同的方法使用函数。
指定 SQL SECURITY INVOKER 后,必须对每个调用该过程的用户加以标注,因此会使用更多内存。另外,指定 SQL SECURITY INVOKER 后,也会作为调用者进行名称解析。因此,应注意用适合的所有者限定所有对象名称(表、过程等)。
除非所有函数声明为 NOT DETERMINISTIC,否则它们将被视为确定型。确定型函数为相同的参数返回一致的结果,并且没有副作用。即,数据库服务器假定对具有相同参数的同一函数连续进行两次调用将返回相同的结果,并且不会对查询的语义产生任何不良的副作用。
如果函数返回一个结果集,则它不能同时设置输出参数或返回一个返回值。
除非创建临时函数,否则必须具有 RESOURCE 权限。
外部函数(包括 Java 函数)必须有 DBA 权限。
自动提交,即使是临时函数也同样。
SQL/2008 CREATE FUNCTION 是 SQL/2008 标准的核心功能,尽管 SQL Anywhere 中支持的某些它的组件是可选 SQL 语言功能。这些功能的子集包括:
SQL SECURITY 子句是可选语言功能 T324。
将 LONG VARCHAR、LONG NVARCHAR 或 LONG BINARY 值传递给 SQL 函数的能力是语言功能 T041。
使用 CREATE TABLE 或 DROP TRIGGER 等语句在 SQL 函数中创建或修改模式对象的能力是语言功能 T651。
在 SQL 函数中使用动态 SQL 语句(包括 EXECUTE IMMEDIATE、PREPARE 和 DESCRIBE 等语句)的能力是语言功能 T652。
CREATE FUNCTION 语句的几个子句是服务商扩充。其中包括:
TEMPORARY 子句。
ON EXCEPTION RESUME 子句。
特定例程参数的可选 DEFAULT 子句。
使用 AS 子句的 Transact-SQL 函数的说明。
可选的 OR REPLACE 子句。
Transact-SQL Adaptive Server Enterprise 支持 CREATE FUNCTION。Adaptive Server Enterprise 不支持函数参数的可选 IN 关键字。
下面的函数将 firstname 字符串和 lastname 字符串串联在一起。
CREATE FUNCTION fullname( firstname CHAR(30), lastname CHAR(30) ) RETURNS CHAR(61) BEGIN DECLARE name CHAR(61); SET name = firstname || ' ' || lastname; RETURN (name); END; |
以下示例将替换在第一个示例中创建的 fullname 函数。在代替该函数后,将移除局部变量 name
:
CREATE OR REPLACE FUNCTION fullname( firstname CHAR(30), lastname CHAR(30) ) RETURNS CHAR(61) BEGIN RETURN ( firstname || ' ' || lastname ); END; |
以下示例说明 fullname 函数的用法。
从两个提供的字符串中返回完整的名称:
SELECT fullname ( 'joe', 'smith' ); |
fullname('joe', 'smith') |
---|
joe smith |
列出所有雇员的姓名:
SELECT fullname ( GivenName, Surname ) FROM Employees; |
fullname (GivenName, Surname) |
---|
Fran Whitney |
Matthew Cobb |
Philip Chin |
Julie Jordan |
... |
以下函数使用 Transact-SQL 语法:
CREATE FUNCTION DoubleIt( @Input INT ) RETURNS INT AS BEGIN DECLARE @Result INT SELECT @Result = @Input * 2 RETURN @Result END; |
语句 SELECT DoubleIt( 5 )
返回值 10
。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |