SQL UDFs 简介

可以使用 SQL 编写用户定义函数 (UDF) 的处理程序。本部分中的主题描述如何设计和编写 SQL 处理程序。您还会发现一些例子。

有关 UDFs 的介绍,包括可用于编写 UDF 处理程序的语言列表,请参阅 用户定义的函数概述。

有了处理程序后,就可以用 SQL 创建 UDF。有关使用 SQL 创建或调用 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                |
+--------------------+

有关使用角色和权限来管理访问控制的更多信息,请参阅 访问控制概述。