Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (A-D)

 

CREATE FUNCTION 语句

使用此语句在数据库中创建用户定义的 SQL 函数。要创建外部函数接口,请参见CREATE FUNCTION 语句(外部过程)。要创建 Web 服务函数,请参见CREATE FUNCTION 语句(Web 服务)

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
 ...
参数
  • OR REPLACE 子句   指定 CREATE OR REPLACE FUNCTION 将创建一个新函数或替换同名的现有函数。如果是替换,此子句将更改函数的定义,但保留现有权限。

    不能将 OR REPLACE 子句与临时函数一起使用。

  • TEMPORARY 关键字   如果指定 CREATE TEMPORARY FUNCTION,则将意味着该函数仅对创建它的连接可见,并在删除该连接时随之自动删除。也可以显式删除临时函数。无法在临时函数上执行 ALTER、GRANT 或 REVOKE,而且与其它函数不同,临时函数不会在目录或事务日志中予以记录。

    临时函数使用其创建者(当前用户)或指定所有者的权限进行执行。可在以下情况下为临时函数指定所有者:

    • 临时函数是在永久存储过程中创建的

    • 临时函数与永久存储过程的所有者相同

    要删除临时函数的所有者,必须首先删除该临时函数。

    临时函数可在连接到只读数据库时加以创建和删除。

    不能将 OR REPLACE 子句与临时函数一起使用。

  • SQL SECURITY 子句   SQL SECURITY 子句定义该函数是作为 INVOKER(调用该函数的用户)执行还是作为 DEFINER(拥有该函数的用户)执行。缺省值为 DEFINER。

  • compound-statement   一组用 BEGIN 和 END 括起来的 SQL 语句,中间用分号分隔。请参见BEGIN 语句

  • tsql-compound-statement   一批 Transact-SQL 语句。请参见Transact-SQL 批处理概述CREATE PROCEDURE 语句 [T-SQL]

  • ON EXCEPTION RESUME 子句   使用 Transact-SQL -like 错误处理。请参见CREATE PROCEDURE 语句

  • [ 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。

注释

CREATE FUNCTION 语句在数据库中创建函数。通过指定所有者名称,可以为其他用户创建函数。根据权限,可通过与其它非集合函数完全相同的方法使用函数。

参数名必须符合数据库标识符规则。它们必须是有效的 SQL 数据类型,且必须以关键字 IN 作为前缀,以表明参数是为函数提供值的表达式。

执行函数时,不必指定所有参数。如果在 CREATE FUNCTION 语句中提供了缺省值,则会为缺少的参数指派缺省值。如果调用程序既未提供参数又未设置缺省值,则会给出错误。

指定 SQL SECURITY INVOKER 后,必须对每个调用该过程的用户加以标注,因此会使用更多内存。另外,指定 SQL SECURITY INVOKER 后,也会作为调用者进行名称解析。因此,应注意用适合的所有者限定所有对象名称(表、过程等)。

除非所有函数声明为 NOT DETERMINISTIC,否则它们将被视为确定型。确定型函数为相同的参数返回一致的结果,并且没有副作用。即,数据库服务器假定对具有相同参数的同一函数连续进行两次调用将返回相同的结果,并且不会对查询的语义产生任何不良的副作用。

如果函数返回一个结果集,则它不能同时设置输出参数或返回一个返回值。

权限

除非创建临时函数,否则必须具有 RESOURCE 权限。

外部函数(包括 Java 函数)必须有 DBA 权限。

副作用

自动提交。

另请参见
标准和兼容性
  • SQL/2003   持久存储模块特性。

示例

下面的函数将 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