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

SQL Anywhere 12.0.0 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询优化与执行 » 语义查询转换

 

内置用户定义的函数

当作为查询的一部分调用简单用户定义的函数时,有时会内置这些函数。即,查询会被重写以等同于初始查询,但却没有函数定义。决不会内置临时函数、递归函数和带有 NOT DETERMINISTIC 子句的函数。另外,如果通过子查询将某个函数作为参数调用,或从临时过程内部调用该函数时,不会内置该函数。

如果用户定义的函数采用以下形式之一,则可以内置这些函数:

  • 包含一个 RETURN 语句的函数。例如:

    CREATE FUNCTION F1( arg1 INT, arg2 INT )
    RETURNS INT
    BEGIN
     RETURN arg1 * arg2
    END;
  • 声明一个变量、指派该变量并返回一个值的函数。例如:

    CREATE FUNCTION F2( arg1 INT )
    RETURNS INT
    BEGIN
     DECLARE result INT;
     SET result = ( SELECT ManagerID FROM Employees WHERE EmployeeID=arg1 );
     RETURN result;
    END;
  • 声明一个变量、选入该变量并返回一个值的函数。例如:

    CREATE FUNCTION F3( arg1 INT )
    RETURNS INT
    BEGIN
     DECLARE result INT;
     SELECT ManagerID INTO result FROM Employees e1 WHERE EmployeeID=arg1;
     RETURN result;
    END;
    

通过以下步骤内置用户定义的函数:复制用户定义的函数主体,通过调用插入参数,然后插入适当的 CAST 函数以确保查询的重写形式等效于原始形式。例如,假设您创建了一个函数(类似于先前定义的函数 F1),然后在查询的 FROM 子句中调用该过程,如下所示:

SELECT F1( e.EmployeeID, 2.5 ) FROM Employees e;

数据库服务器可能按如下方式重写该查询:

SELECT CAST( e.EmployeeID AS INT ) * CAST( 2.5 AS INT ) FROM Employees e;
 另请参见