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 的用法 » 存储过程和触发器 » 使用过程、触发器和批处理 » 用户定义的函数简介

 

调用用户定义的函数

在您要使用内置的非集合函数的任何地方,都可以根据权限使用用户定义的函数。

以下语句在 Interactive SQL 中从包含名字和姓氏的两列返回全名:

SELECT FullName(GivenName, Surname) 
 AS "Full Name"
 FROM Employees;
Full Name
Fran Whitney
Matthew Cobb
Philip Chin
...

以下语句在 Interactive SQL 中从提供的名字和姓氏返回全名:

SELECT FullName('Jane', 'Smith') 
 AS "Full Name";
Full Name
Jane Smith

已被授予函数的 EXECUTE 权限的任何用户都可以使用 FullName 函数。

示例

以下用户定义的函数阐释变量的局部声明。

Customers 表包括加拿大和美国客户。用户定义的函数 Nationality 根据 Country 列生成一个 3 个字母组成的国家/地区代码。

CREATE FUNCTION Nationality( CustomerID INT )
RETURNS CHAR( 3 )
BEGIN
    DECLARE nation_string CHAR(3);
    DECLARE nation country_t;
    SELECT DISTINCT Country INTO nation 
    FROM Customers 
    WHERE ID = CustomerID;
    IF nation = 'Canada' THEN
            SET nation_string = 'CDN';
    ELSE IF nation = 'USA' OR nation = ' ' THEN
            SET nation_string = 'USA';
        ELSE
            SET nation_string = 'OTH';
        END IF;
    END IF;
RETURN ( nation_string );
END;

此示例声明 nation_string 变量来保存国籍字符串,使用 SET 语句来设置该变量的值,并且将 nation_string 字符串的值返回给调用环境。

以下查询列出 Customers 表中的所有加拿大客户:

SELECT *
FROM Customers
WHERE Nationality(ID) = 'CDN';

游标和异常的声明将在后面几节中讨论。

注意

尽管此函数适合于概念阐述,但在涉及多行的 SELECT 中使用时,其执行效果会非常差。例如,如果在某张表的查询的 SELECT 列表中使用该函数,该表包含 100,000 行,其中 10,000 行将被返回,则该函数将被调用 10,000 次。如果在同一查询的 WHERE 子句中使用该函数,则该函数会被调用 100,000 次。