此 SQL 语句创建没有副作用的只读用户定义函数。这意味着函数主体中不允许 DDL 和 DML 语句(INSERT、UPDATE 和 DELETE)。从函数主体中选择或调用的所有函数或过程必须是只读的。
CREATE [ OR REPLACE ] FUNCTION
[ ( ) ]
RETURNS
[ LANGUAGE ]
[ SQL SECURITY { DEFINER | INVOKER } ]
[ DEFAULT SCHEMA ]
[ ]
[ DETERMINISTIC ]
[ WITH ENCRYPTION ]
[ STRUCTURED FILTER CHECK ]
AS
{ [ HEADER ONLY ON INVALID ] BEGIN
END [ ]
| HEADER ONLY }
::= [.] 要创建的函数的标识符,模式名称可选。
::= [{,}...] 函数的输入参数。
::= [IN] 具有关联数据类型的函数参数。
::= 参数的变量名。
::= [ARRAY] | | | 标量用户定义函数 (SUDF) 支持以下原始 SQL 类型。还支持表类型(表变量、物理表或视图)作为 SUDF 中的输入。支持数组作为输入和返回类型。
::= DATE | TIME | TIMESTAMP | SECONDDATE | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | SMALLDECIMAL | REAL | DOUBLE | VARCHAR | NVARCHAR | VARBINARY | CLOB | NCLOB | BLOB | ST_GEOMETRY
::=
具有表参数的 SUDF 可以像任何其他 SUDF 一样使用,但以下情况例外:
FROM 或 WITH 子句中)。
TABLE TYPE 参数。
select sudf_taking_table_parameter(t1) from t2;
表用户定义的函数 (TUDF) 允许以下范围的原始 SQL 类型。还支持表类型和数组类型作为输入。
::= DATE | TIME | TIMESTAMP | SECONDDATE | TINYINT | SMALLINT | INTEGER | BIGINT | DECIMAL | SMALLDECIMAL | REAL | DOUBLE | VARCHAR | NVARCHAR | ALPHANUM | VARBINARY | CLOB | NCLOB | BLOB | ST_GEOMETRY
::=
要查看之前使用 CREATE TYPE 命令定义的表类型,请参阅 CREATE TYPE。
::= TABLE ()
::= [{, }...]
::=
::=
在签名中隐式定义的表类型。
::= | 表 UDF 必须返回类型由 UDF 必须返回在
::= [{, }...]
::= [ARRAY]
以下表达式定义输出参数:
::= TABLE ( ) 以下表达式定义返回的表数据的结构。
LANGUAGE
::= SQLSCRIPT
缺省值:SQLSCRIPT
定义函数中使用的编程语言。 备注只能定义 SQLScript UDF。
SQL SECURITY
::= DEFINER | INVOKER
缺省值:DEFINER(表 UDF)/INVOKER(标量 UDF)
指定函数的安全模式。
DEFINER指定使用功能定义者的权限执行功能。
INVOKER指定使用函数调用者的特权执行函数。
DEFAULT SCHEMA
::=
指定函数主体中非限定对象的模式。如果未指定任何内容,则使用会话的 current_schema。
::= []
[]
定义表用户定义函数和标量用户定义函数的主体。由于函数标记为只读,因此函数主体中不允许 DDL 或 DML 语句(INSERT、UPDATE 和 DELETE)。
备注标量函数可以标记为 DETERMINISTIC,前提是它们始终在使用一组特定的输入参数进行调用时返回相同的结果。
有关 CREATE PROCEDURE。
::= DECLARE { || }
::= [CONSTANT] { | } [NOT NULL][];
::= ARRAY [ = ]
::= ARRAY ( [{,}...] )
::= { DEFAULT | = }
::= !!An element of the type specified by
定义一个或多个具有关联标量类型或数组类型的局部变量。
数组类型以 <类型> 作为其元素类型。数组的范围为 1 到 2,147,483,647,即基础结构的限制。
您可以通过指定
::= 请参见 CREATE PROCEDURE 。
::= { } ::=
|
|
|
|
|
|
|
|
|
|
|
|
|
有关 CREATE PROCEDURE 。
::= RETURN
::= |
表函数必须包含 return 语句。
抬头仅在无效时
当函数变为无效时,将其切换为 HEADER ONLY 函数。对于普通函数,如果相关对象处于无效状态,则无法创建。但是,可以为失效的 HEADER ONLY ON INVALID 函数创建相关对象,因为它会在失效时自动切换到 HEADER ONLY 功能。
仅表用户定义的函数 (TUDF) 支持此子句。
此示例使用 HEADER ONLY ON INVALID 选项创建函数 hooi1 ,使其在变为无效时切换到仅标头状态。
CREATE TABLE T2 (i INT);
CREATE FUNCTION hooi1 RETURNS TABLE(i INT)
AS HEADER ONLY ON INVALID
BEGIN
RETURN SELECT i FROM T2;
END;
DROP TABLE T2;
CREATE FUNCTION hooi2 RETURNS TABLE(i INT)
AS
BEGIN
RETURN SELECT i FROM hooi1();
END;
以下示例显示了如何创建表函数:
CREATE FUNCTION scale (val INT)
RETURNS TABLE (a INT, b INT) LANGUAGE SQLSCRIPT AS
BEGIN
RETURN SELECT a, :val * b AS b FROM mytab;
END;
::= [.]
以下示例显示了如何调用表函数标度:
以下示例显示了如何创建名为 func_add_mul 的标量函数,该函数采用两个类型为 double 的值并返回两个类型为 double 的值:
CREATE FUNCTION func_add_mul(x Double, y Double)
RETURNS result_add Double, result_mul Double
LANGUAGE SQLSCRIPT READS SQL DATA AS
BEGIN
result_add = :x + :y;
result_mul = :x * :y;
END;
在查询中,可以在投影列表或 where 子句中使用标量函数。在以下示例中,在投影列表中使用 func_add_mul:
CREATE TABLE TAB (a Double, b Double);
INSERT INTO TAB VALUES (1.0, 2.0);
INSERT INTO TAB VALUES (3.0, 4.0);
SELECT a, b, func_add_mul(a, b).result_add as ADD, func_add_mul(a, b).result_mul as MUL FROM TAB ORDER BY a;
A B ADD MUL
-------------------
1 2 3 2
3 4 7 12
除了在查询中使用标量函数外,还可以在标量分配中使用标量函数,例如。:
CREATE FUNCTION func_mul(input1 INT)
RETURNS output1 INT LANGUAGE SQLSCRIPT
AS
BEGIN
output1 = :input1 * :input1;
END;
CREATE FUNCTION func_mul_wrapper(input1 INT)
RETURNS output1 INT LANGUAGE SQLSCRIPT AS
BEGIN
output1 = func_mul(:input1);
END;
SELECT func_mul_wrapper(2) as RESULT FROM dummy;
RESULT
-----------------
4