SQL UDFs 简介¶
可以使用 SQL 编写用户定义函数 (UDF) 的处理程序。本部分中的主题描述如何设计和编写 SQL 处理程序。您还会发现一些例子。
有关 UDFs 的介绍,包括可用于编写 UDF 处理程序的语言列表,请参阅 用户定义函数概述。
有了处理程序后,就可以用 SQL 创建 UDF。有关使用 SQL 创建或调用 UDF 的信息,请参阅 创建 UDF 或 调用 UDF。
备注
要了解与 SQL UDF 处理程序相关的限制,请参阅 SQL UDF 限制。
本主题内容:
SQL 处理程序的工作原理¶
当用户调用 UDF 时,用户将 UDF 的名称和实参传递给 Snowflake。Snowflake 调用相关处理程序代码(如有实参则使用实参)来执行 UDF 的逻辑。然后,处理程序方法将输出返回给 Snowflake,Snowflake 再将其传回给客户端。
函数定义可以是 SQL 表达式,该表达式返回一个标量(即单个)值,或者如果定义为表函数,则返回一组行。
示例¶
以下示例中的代码创建一个名为 area_of_circle
的 UDF,该函数包含处理程序代码,可根据作为实参的 UDF 收到的半径值计算圆的面积。
CREATE FUNCTION area_of_circle(radius FLOAT)
RETURNS FLOAT
AS
$$
pi() * radius * radius
$$
;
一般用法¶
SQL UDF 计算任意 SQL 表达式,并返回该表达式的结果。
函数定义可以是 SQL 表达式,该表达式返回一个标量(即单个)值,或者如果定义为表函数,则返回一组行。
SQL UDFs 的安全/权限要求¶
如果函数定义引用非限定表,则该表将在包含函数的架构中解析。如果引用另一个架构对象(例如表、视图或其他函数),则函数的所有者需要具有对该架构对象的访问权限。函数的调用者无需具有对函数定义中引用的对象的访问权限,而只需要有权使用函数。
例如,管理员拥有一个名为 users
的表,该表包含通常无法访问的敏感数据,但是,管理员可以通过其他用户具有访问权限的函数公开用户总数:
use role dataadmin; desc table users; +-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+ | name | type | kind | null? | default | primary key | unique key | check | expression | comment | |-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------| | USER_ID | NUMBER(38,0) | COLUMN | Y | [NULL] | N | N | [NULL] | [NULL] | [NULL] | | USER_NAME | VARCHAR(100) | COLUMN | Y | [NULL] | N | N | [NULL] | [NULL] | [NULL] | ... ... ... +-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+ create function total_user_count() returns number as 'select count(*) from users'; grant usage on function total_user_count() to role analyst; use role analyst; -- This will fail because the role named "analyst" does not have the -- privileges required in order to access the table named "users". select * from users; FAILURE: SQL compilation error: Object 'USERS' does not exist. -- However, this will succeed. select total_user_count(); +--------------------+ | TOTAL_USER_COUNT() | |--------------------+ | 123 | +--------------------+
有关使用角色和权限来管理访问控制的更多信息,请参阅 访问控制概述。