当作为查询的一部分调用简单用户定义的函数时,有时会内置这些函数。即,查询会被重写以等同于初始查询,但却没有函数定义。决不会内置临时函数、递归函数和带有 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; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |