Criação de uma função definida pelo usuário¶
Você pode criar uma função definida pelo usuário (UDF) usando qualquer um dos vários métodos disponíveis no Snowflake. Esses métodos são descritos neste tópico.
Criar uma UDF¶
Escreva a lógica da função como um manipulador usando uma das várias linguagens compatíveis, incluindo Python, Java e Scala.
Escolha uma ferramenta ou API para criar a função com o manipulador que você escreveu.
Para obter mais informações sobre cada um deles, consulte Ferramentas para criar UDFs.
SQL
Use o SQL e escreva lógica em uma das várias linguagens.
Snowpark
Use a Snowpark API para Java, Python ou Scala.
Linha de comando
Execute os comandos do CLI para criar a função.
API de Python
Execute os comandos Python no lado do cliente para criar a função.
REST
Faça solicitações a uma RESTful API para criar a função.
Execute a função usando uma das várias ferramentas, dependendo de suas necessidades.
Ferramentas para criar UDFs¶
Você pode criar uma UDF usando qualquer um dos vários métodos disponíveis no Snowflake, dependendo da linguagem e do conjunto de habilidades que tiver disponível. Escolha a ferramenta certa para suas necessidades na tabela a seguir.
Linguagem |
Abordagem |
---|---|
SQL Execute um comando SQL, por exemplo, usando Snowsight. |
Execute o comando SQL CREATE FUNCTION para criar uma função com código de manipulador escrito em uma das seguintes linguagens: |
Java, Python ou Scala com Snowpark Escreva o código em uma das linguagens compatíveis e, em seguida, execute o código localmente para realizar operações no Snowflake. |
Execute o código do cliente que usa as Snowpark APIs em um dos seguintes idiomas. |
Linha de comando Crie e gerencie entidades Snowflake executando comandos a partir da linha de comando. |
Execute comandos do Snowflake CLI. |
Python No cliente, escreva o código que executa operações de gerenciamento no Snowflake. |
Execute o código que usa a Snowflake Python API. |
RESTful APIs (independente da linguagem) Faça solicitações de pontos de extremidade RESTful para criar e gerenciar entidades Snowflake. |
Faça uma solicitação para criar um procedimento usando a Snowflake REST API |
Principais propriedades¶
A seguir descrevemos algumas das propriedades necessárias ou tipicamente utilizadas na criação de uma função.
- Nome da função:
O nome da função não precisa corresponder ao nome do manipulador. Para saber mais sobre restrições de nome e convenções, consulte Como nomear e sobrecarregar procedimentos e UDFs.
- Argumentos:
Para obter mais informações sobre os requisitos, consulte Definição de argumentos para UDFs e procedimentos armazenados.
- Seu tipo de retorno:
Para obter mais informações sobre como o Snowflake mapeia tipos de dados SQL para os tipos de dados do manipulador, consulte Mapeamentos de tipos de dados entre linguagens do manipulador e SQL.
- Seu nome do manipulador:
Quando necessário, esse é o nome da classe ou do método que contém o código que é executado quando a função é executada. Você precisa especificar um nome de manipulador somente para manipuladores escritos em Java, Python e Scala. Para manipuladores JavaScript e SQL, todos os códigos especificados em linha serão executados como manipuladores.
- Dependências:
Para um manipulador escrito em Java, Python ou Scala, talvez você também precise especificar a biblioteca do Snowpark, por exemplo, ao criar a função.
Para saber mais sobre como disponibilizar dependências para seu manipulador, consulte Disponibilização das dependências para seus códigos.
- Tempo de execução da linguagem do manipulador:
Quando a linguagem do manipulador for Java, Python ou Scala, especifique a versão de tempo de execução para indicar qual versão de tempo de execução suportada deve ser usada. Lembre-se de que, se você usar a versão padrão, ela será alterada com o tempo.
Requisitos de controle de acesso¶
A função usada para executar essa operação deve ter, no mínimo, os seguintes privilégios:
Privilégio |
Objeto |
Notas |
---|---|---|
CREATE FUNCTION |
Esquema |
O privilégio permite apenas a criação de funções definidas pelo usuário no esquema. Se quiser habilitar a criação de funções de métricas de dados, a função deve ter o privilégio CREATE DATA METRIC FUNCTION. |
USAGE |
Função |
Conceder o privilégio USAGE na função recém-criada a uma função permite que os usuários com essa função chamem a função em outro lugar no Snowflake (como a função de proprietário de política de mascaramento para tokenização externa). |
USAGE |
Integração de acesso externo |
Obrigatório em integrações, se houver, especificadas pelo parâmetro EXTERNAL_ACCESS_INTEGRATIONS. Para obter mais informações, consulte CREATE EXTERNAL ACCESS INTEGRATION. |
READ |
Segredo |
Obrigatório em segredos, se houver, especificadas pelo parâmetro SECRETS. Para obter mais informações, consulte Criação de um segredo para representar credenciais e Uso da integração de acesso externo em uma função ou procedimento. |
USAGE |
Esquema |
Obrigatório em esquemas que contêm segredos, se houver, especificados pelo parâmetro SECRETS. Para obter mais informações, consulte Criação de um segredo para representar credenciais e Uso da integração de acesso externo em uma função ou procedimento. |
O privilégio USAGE no banco de dados e no esquema pai é necessário para executar operações em qualquer objeto de um esquema.
Para instruções sobre como criar uma função personalizada com um conjunto específico de privilégios, consulte Criação de funções personalizadas.
Para informações gerais sobre concessões de funções e privilégios para executar ações de SQL em objetos protegíveis, consulte Visão geral do controle de acesso.
Notas de uso¶
As notas a seguir descrevem notas de uso relevantes para as linguagens compatíveis com a escrita de manipuladores. Embora as observações nas seções a seguir se refiram a cláusulas do comando SQL CREATE FUNCTION, essas cláusulas são normalmente representadas de outras formas em outras ferramentas que você pode usar para criar funções.
Todos os idiomas¶
function_definition
tem restrições de tamanho. O tamanho máximo permitido está sujeito a alterações.Os delimitadores em torno de
function_definition
podem ser aspas simples ou um par de sinais de cifrão.Usar
$$
como delimitador facilita a escrita de funções com aspas simples.Se o delimitador do corpo da função for o caractere de aspa simples, então qualquer aspa simples dentro de
function_definition
(como literais de cadeia de caracteres) deve ter um escape com aspas simples.Se utilizar uma UDF em uma política de mascaramento, certifique-se de que o tipo de dados da coluna, a UDF e a política de mascaramento sejam correspondentes. Para obter mais informações, consulte Funções definidas pelo usuário em uma política de mascaramento.
Se você especificar a função CURRENT_DATABASE ou CURRENT_SCHEMA no código do manipulador da UDF, a função retornará o banco de dados ou esquema que contém a UDF, não o banco de dados ou esquema em uso para a sessão.
Em relação aos metadados:
Atenção
Os clientes devem garantir que nenhum dado pessoal (exceto para um objeto do usuário), dados sensíveis, dados controlados por exportação ou outros dados regulamentados sejam inseridos como metadados ao usar o serviço Snowflake. Para obter mais informações, consulte Campos de metadados no Snowflake.
Instruções CREATE OR REPLACE <object> são atômicas. Ou seja, quando um objeto é substituído, o objeto antigo é excluído e o novo objeto é criado em uma única transação.
Java¶
Em Java, os tipos de dados primitivos não permitem valores NULL, portanto, passar um NULL para um argumento de tal tipo resulta em um erro.
Na cláusula HANDLER, o nome do método diferencia maiúsculas e minúsculas.
Nas cláusulas IMPORTS e TARGET_PATH:
Pacote, classe e nome(s) do(s) arquivo(s) diferenciam maiúsculas e minúsculas.
O(s) nome(s) do(s) estágio(s) não diferencia(m) maiúsculas e minúsculas.
É possível usar a cláusula PACKAGES para especificar nomes de pacotes e números de versão para dependências definidas pelo sistema Snowflake, como as do Snowpark. Para outras dependências, especificar os arquivos JAR de dependência com a cláusula IMPORTS.
O Snowflake valida isso:
O arquivo JAR especificado no HANDLER da instrução CREATE FUNCTION existe e contém a classe e o método especificados.
Os tipos de entrada e saída especificados na instrução da UDF são compatíveis com os tipos de entrada e saída do método Java.
A validação pode ser feita no momento da criação ou da execução, dependendo se você está conectado a um warehouse ativo do Snowflake.
Tempo de criação – Se você estiver conectado a um warehouse ativo do Snowflake no momento em que a instrução CREATE FUNCTION for executada, a UDF será validada no tempo de criação.
Tempo de execução – Se você não estiver conectado a um warehouse ativo do Snowflake, a UDF é criada, mas não é validada imediatamente e o Snowflake retorna a seguinte mensagem:
Function <nome> created successfully, but could not be validated since there is no active warehouse
.
JavaScript¶
O Snowflake não valida o código JavaScript no momento da criação da UDF. Em outras palavras, a criação da UDF é bem-sucedida, independentemente de o código ser válido. Se o código não for válido, o Snowflake retornará erros quando a UDF for chamada no momento da consulta.
Python¶
Na cláusula HANDLER, o nome da função do manipulador diferencia maiúsculas e minúsculas.
Na cláusula IMPORTS:
O(s) nome(s) dos arquivos diferencia(m) maiúsculas e minúsculas.
O(s) nome(s) do(s) estágio(s) não diferencia(m) maiúsculas e minúsculas.
É possível usar a cláusula PACKAGES para especificar nomes de pacotes e números de versão para dependências, como as do Snowpark. Para outras dependências, especificar os arquivos de dependência com a cláusula IMPORTS.
O Snowflake valida isso:
A função ou classe especificada do HANDLER na instrução CREATE FUNCTION.
Os tipos de entrada e saída especificados na instrução da UDF são compatíveis com os tipos de entrada e saída do manipulador.
Scala¶
Na cláusula HANDLER, o nome do método diferencia maiúsculas e minúsculas.
Nas cláusulas IMPORTS e TARGET_PATH:
Pacote, classe e nome(s) do(s) arquivo(s) diferenciam maiúsculas e minúsculas.
O(s) nome(s) do(s) estágio(s) não diferencia(m) maiúsculas e minúsculas.
É possível usar a cláusula PACKAGES para especificar nomes de pacotes e números de versão para dependências definidas pelo sistema Snowflake, como as do Snowpark. Para outras dependências, especificar os arquivos JAR de dependência com a cláusula IMPORTS.
O Snowflake valida isso:
O arquivo JAR especificado no HANDLER da instrução CREATE FUNCTION existe e contém a classe e o método especificados.
Os tipos de entrada e saída especificados na instrução da UDF são compatíveis com os tipos de entrada e saída do método Scala.
A validação pode ser feita no momento da criação ou da execução, dependendo se você está conectado a um warehouse ativo do Snowflake.
Tempo de criação – Se você estiver conectado a um warehouse ativo do Snowflake no momento em que a instrução CREATE FUNCTION for executada, a UDF será validada no tempo de criação.
Tempo de execução – Se você não estiver conectado a um warehouse ativo do Snowflake, a UDF é criada, mas não é validada imediatamente e o Snowflake retorna a seguinte mensagem:
Function <nome> created successfully, but could not be validated since there is no active warehouse
.
SQL¶
Atualmente, a cláusula NOT NULL não é aplicada para UDFs SQL.
Criação de uma UDF com SQL¶
Você pode criar uma UDF com SQL usando as seguintes etapas.

Você cria uma UDF com os seguintes passos:
Escreva o código do manipulador que executa quando a UDF é chamada.
Você pode usar uma das linguagens do manipulador suportadas. Para obter mais informações, consulte Linguagens e ferramentas compatíveis.
Escolha se você vai manter o código do manipulador em linha com a instrução SQL CREATE FUNCTION ou se vai se referir a ele em um estágio.
Cada um tem suas vantagens. Para obter mais informações, consulte Como manter o código do manipulador em linha ou em um estágio.
Execute uma instrução CREATE FUNCTION em SQL, especificando as propriedades da função.
O código no exemplo a seguir cria uma UDF chamada
function_name
com o manipulador em linhaHandlerClass.handlerMethod
.create function function_name(x integer, y integer) returns integer language java handler='HandlerClass.handlerMethod' target_path='@~/HandlerCode.jar' as $$ class HandlerClass { public static int handlerMethod(int x, int y) { return x + y; } } $$;
A seguir descrevemos algumas das propriedades necessárias ou tipicamente utilizadas na criação de uma função.
Nome da função.
O nome da UDF não precisa corresponder ao nome do manipulador. A instrução CREATE FUNCTION associa o nome da UDF com o manipulador.
Para saber mais sobre restrições de nome e convenções, consulte Como nomear e sobrecarregar procedimentos e UDFs.
Argumentos de função, se houver.
Consulte Definição de argumentos para UDFs e procedimentos armazenados.
Tipo de retorno com a cláusula RETURNS.
Para um valor de retorno escalar, a cláusula RETURNS especificará um único tipo de retorno; para um valor de retorno tabular, RETURNS especificará a palavra-chave TABLE, especificando o tipo de coluna no valor de retorno tabular.
Para obter mais informações sobre como o Snowflake mapeia tipos de dados SQL para os tipos de dados do manipulador, consulte Como nomear e sobrecarregar procedimentos e UDFs.
Nome do manipulador com a cláusula HANDLER.
Quando necessário, este é o nome da classe ou método que contém o código que executa quando a UDF é chamada. Você precisa especificar um nome de manipulador somente para manipuladores escritos em Java e Python. Para manipuladores JavaScript e SQL, todos os códigos especificados em linha serão executados como manipuladores.
A tabela a seguir descreve a forma do valor da cláusula HANDLER com base na linguagem do manipulador e no tipo de função.
Linguagem do manipulador
UDF
UDTF
Java
Nome do método e classe
Por exemplo:
MyClass.myMethod
Somente o nome da classe. O nome do método do manipulador é pré-determinado pela interface necessária.
JavaScript
Nenhum.
Nenhum.
Python
Nome do método e classe se for usada uma classe; caso contrário, nome da função.
Por exemplo:
module.my_function
oumy_function
Somente o nome da classe. O nome do método do manipulador é pré-determinado pela interface necessária.
SQL
Nenhum.
Nenhum.
Dependências exigidas pelo manipulador, se houver, usando as cláusulas IMPORTS ou PACKAGES.
Para saber mais sobre como disponibilizar dependências para seu manipulador, consulte Disponibilização das dependências para seus códigos.
Linguagem do manipulador com a cláusula RUNTIME_VERSION.
Quando a linguagem do manipulador for Java ou Python, use a cláusula RUNTIME_VERSION para especificar qual versão suportada em tempo de execução deve ser usada. Omitir a cláusula levará o Snowflake a usar o padrão, que pode mudar no futuro.