您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

创建功能

此 SQL 语句创建没有副作用的只读用户定义函数。这意味着函数主体中不允许 DDL 和 DML 语句(INSERTUPDATEDELETE)。从函数主体中选择或调用的所有函数或过程必须是只读的。

语法

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 子句中)。

  • 不支持将参数化视图、脚本化计算视图或 TUDF 作为输入。

  • 不支持 ANY TABLE TYPE 参数。

  • 不支持 SQLScript 内部类型,例如游标变量或 ROW 类型。备注 请考虑以下有关性能的注释。SUDF 逐行操作表数据。在以下示例中,操作至少为 O(record_count(t1) * record_count(t2))。 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 语句(INSERTUPDATEDELETE)。

    备注标量函数可以标记为 DETERMINISTIC,前提是它们始终在使用一组特定的输入参数进行调用时返回相同的结果。

    有关 的定义,请参见 CREATE PROCEDURE

     ::= DECLARE { || }
    

    ::= [CONSTANT] { | } [NOT NULL][];

    ::= ARRAY [ = ]

    ::= ARRAY ( [{,}...] )

    ::= { DEFAULT | = }

    ::= !!An element of the type specified by

    定义一个或多个具有关联标量类型或数组类型的局部变量。

    数组类型以 <类型> 作为其元素类型。数组的范围为 1 到 2,147,483,647,即基础结构的限制。

    您可以通过指定 s 分配缺省值。有关详细信息,请参阅 SAP Help Portal 上 SAP HANA 参考指南中的表达式。

     ::= 

    请参见 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;

    ::= [.]

    以下示例显示了如何调用表函数标度: