Tipos definidos pelo usuário¶
Você pode definir tipos definidos pelo usuário, que são novos tipos de dados baseados em :doc:` tipos de dados do Snowflake </sql-reference-data-types>` existentes. Por exemplo, suponha que você queira definir uma coluna para a idade de uma pessoa e queira restringir os valores para incluir números com no máximo três dígitos e nenhum dígito após a vírgula decimal. Você pode definir um tipo de dados chamado age que corresponde a NUMBER(3,0).
Um tipo definido pelo usuário é um objeto de nível de esquema que pode ser utilizado em todos os locais em que é possível utilizar tipos, incluindo definições de coluna, definições de função e procedimento e expressões de conversão.
Os tipos definidos pelo usuário podem simplificar a manutenção do esquema e melhorar a qualidade dos dados. Você pode definir um tipo definido pelo usuário uma vez e usá-lo em vários objetos.
Você também pode usar tipos definidos pelo usuário para agrupar campos de dados relacionados em uma única coluna lógica, em vez de usar várias colunas ou tabelas para os campos. Por exemplo, você pode definir um tipo de dados para endereços que seja um tipo estruturado OBJECT com campos para o endereço, cidade, estado e CEP.
Privilégios necessários para tipos definidos pelo usuário¶
Para criar um tipo definido pelo usuário em um esquema, você deve usar uma função que tenha recebido o privilégio CREATE TYPE nesse esquema.
Para obter mais informações, consulte os requisitos de controle de acesso para tipos definidos pelo usuário.
Notas de uso geral para tipos definidos pelo usuário¶
Para alterar a definição de um tipo definido pelo usuário, descarte-o e recrie-o.
Se você alterar a definição de um tipo definido pelo usuário:
As instruções SQL que operam diretamente em colunas de tabela que usam o tipo poderão retornar erros, incluindo instruções SELECT e DML. No entanto, as instruções SQL que não operam diretamente em colunas de tabela que usam o tipo serão executadas normalmente. Por exemplo, se uma tabela contiver uma coluna de tipo definido pelo usuário chamada
typed_columne uma instrução SELECT especificar outras colunas na lista SELECT, a instrução SELECT será executada normalmente. Para corrigir o problema, você pode revisar as instruções SQL para usar os tipos Snowflake subjacentes.Chamadas para funções e procedimentos armazenados que usam o tipo retornarão erros. Para corrigir o problema, descarte e recrie as funções e os procedimentos armazenados.
O comando ALTER TABLE … ALTER COLUMN pode alterar o tipo de dados de uma coluna de um tipo definido pelo usuário para um :doc:` tipo de dados Snowflake </sql-reference-data-types>` compatível ou de um tipo de dados Snowflake para um tipo definido pelo usuário.
Quando você está construindo um objeto para inserir em uma coluna de um tipo definido pelo usuário usando a função OBJECT_CONSTRUCT ou uma constante OBJECT, converta o resultado para o tipo definido pelo usuário.
Para exemplos, consulte Usando um tipo definido pelo usuário para uma coluna de tabela.
Quando os :doc:` operadores de conjunto </sql-reference/operators-query>` (por exemplo, UNION, INTERSECT, EXCEPT) ou as :doc:` funções de expressão condicional </sql-reference/expressions-conditional>` (por exemplo, CASE, IFF, COALESCE, NVL e assim por diante) avaliam uma expressão que resulta em um valor de um tipo definido pelo usuário, o Snowflake determina um tipo comum usando os tipos base subjacentes dos operandos. Por padrão, o tipo de dados do resultado é esse tipo base. Se você quiser que o resultado seja um valor de um tipo definido pelo usuário, converta explicitamente a expressão final para o tipo definido pelo usuário.
As regras a seguir se aplicam quando tipos definidos pelo usuário são utilizados em operações de conjunto ou funções de expressão condicional:
Os tipos definidos pelo usuário são distintos dos tipos base, mas, na resolução do tipo de expressão, eles sofrem coerção para os tipos base a fim de encontrar um tipo comum.
Se as ramificações ou operandos resultarem em um único tipo do Snowflake (por exemplo, VARCHAR ou NUMBER), esse será o tipo do resultado.
Para preservar um tipo definido pelo usuário ou produzir um resultado que seja um valor de um tipo definido pelo usuário, converta a expressão geral usando
CAST(expr AS user-defined type)ouexpr::user-defined type.Tipos base incompatíveis (por exemplo, VARCHAR e NUMBER) seguem as regras de coerção normais. Se não existir um tipo base comum, um erro será retornado.
Para exemplos, consulte Usando operadores de conjunto e funções de expressão condicional com tipos definidos pelo usuário.
É permitido usar tipos definidos pelo usuário e tipos de dados Snowflake compatíveis para :ref:` sobrecarga <label-procedure_function_name_overloading>` de função. Ou seja, você pode especificar um tipo definido pelo usuário para um tipo de argumento de função e pode especificar um tipo de dados Snowflake compatível para um tipo de argumento de uma função com o mesmo nome.
Se um tipo definido pelo usuário for especificado como o tipo RETURN de uma função definida pelo usuário (user-defined function, UDF) SQL ou procedimento armazenado do Snowflake Scripting, o valor de retorno deverá ser convertido explicitamente para o tipo definido pelo usuário no corpo da UDF ou do procedimento armazenado.
Quando um tipo definido pelo usuário é utilizado como argumento ou valor de retorno para uma UDF ou um procedimento escrito em uma linguagem diferente de SQL (como Python ou Java), o tipo definido pelo usuário é tratado da mesma forma que o tipo base.
A evolução de esquema não é compatível com tipos definidos pelo usuário.
Convertendo tipos definidos pelo usuário¶
Os tipos definidos pelo usuário são compatíveis com conversão de tipo de dados, incluindo conversão explícita e implícita (coerção):
Conversão explícita de e para tipos definidos pelo usuário¶
Um valor de tipo definido pelo usuário pode ser convertido nos mesmos tipos de dados que os valores do tipo base. Por exemplo, crie um tipo definido pelo usuário chamado age que seja baseado no tipo NUMBER:
Será possível converter um valor em um tipo definido pelo usuário se o valor puder ser convertido para o tipo base do tipo definido pelo usuário. Por exemplo, é possível converter o valor 10 no tipo NUMBER, então você pode converter o valor para o tipo age:
Um valor de tipo definido pelo usuário pode ser convertido em um tipo de dados diferente se o tipo base do tipo definido pelo usuário puder ser convertido nesse tipo de dados. Por exemplo, um valor NUMBER pode ser convertido no tipo VARCHAR, então o valor 10 do tipo definido pelo usuário age pode ser convertido no tipo VARCHAR:
Coerção de tipos definidos pelo usuário¶
Um valor de tipo definido pelo usuário aplica coerção para o tipo base dele. Portanto, em todas as operações, ele se comporta da mesma forma que o tipo base. Por exemplo, crie um tipo definido pelo usuário chamado age que seja baseado no tipo NUMBER e uma tabela com duas colunas do tipo age:
Insira valores na tabela:
O exemplo a seguir realiza uma operação de adição nos valores da tabela, e o Snowflake aplica coerção aos valores age para valores do tipo NUMBER a fim de concluir a operação. O exemplo usa a função SYSTEM$TYPEOF para mostrar o tipo de dados do resultado:
Exemplos de tipos de dados definidos pelo usuário¶
Os exemplos a seguir mostram como usar tipos definidos pelo usuário:
Usando um tipo definido pelo usuário para uma coluna de tabela¶
No exemplo a seguir, você cria um tipo definido pelo usuário chamado address e, em seguida, usa o tipo em uma tabela:
Crie um tipo definido pelo usuário baseado em um tipo OBJECT estruturado para armazenar informações de endereço:
Crie uma tabela que armazena informações do cliente, incluindo o endereço:
Insira uma linha na tabela e especifique o valor para a coluna
cust_addressconvertendo uma constante OBJECT para o tipoaddress:Insira uma linha na tabela e especifique o valor para a coluna
cust_addresschamando a função OBJECT_CONSTRUCT e convertendo o valor de retorno para o tipoaddress:Insira uma linha na tabela e especifique o valor para a coluna
cust_addressconvertendo uma constante OBJECT para o tipo OBJECT, que é o tipo base do tipoaddress. Geralmente é mais fácil converter uma constante OBJECT no tipo definido pelo usuário, mas este exemplo mostra que a constante OBJECT tem coerção aplicada para o tipo definido pelo usuário:Para exibir as linhas inseridas, consulte a tabela:
Consulte a tabela e use o operador de dois pontos para exibir apenas os valores
zip_codenos dadosaddress:
Usando operadores de conjunto e funções de expressão condicional com tipos definidos pelo usuário¶
Quando os operadores de conjunto ou as funções de expressão condicional avaliam valores de tipos Snowflake e tipos definidos pelo usuário, os tipos devem ser compatíveis e coercíveis em um único tipo. A saída resultante é do tipo base Snowflake, a menos que seja explicitamente convertida para um tipo definido pelo usuário. Para obter mais informações, consulte Notas de uso geral para tipos definidos pelo usuário.
Os exemplos nesta seção usam operadores de conjunto e expressões condicionais com tipos definidos pelo usuário. Primeiro, crie vários tipos definidos pelo usuário com vários tipos base:
A consulta a seguir chama a função IFF. A chamada avalia um valor do tipo definido pelo usuário us_zipcode e um valor de um tipo Snowflake compatível. A consulta usa a função SYSTEM$TYPEOF para mostrar que o resultado é do tipo base Snowflake VARCHAR:
A consulta a seguir é igual à anterior, mas converte o resultado no tipo definido pelo usuário us_zipcode:
A consulta a seguir contém uma expressão CASE que avalia tipos definidos pelo usuário diferentes, mas compatíveis, e retorna um valor de um tipo base Snowflake:
A consulta a seguir é igual à anterior, mas converte o resultado no tipo definido pelo usuário uk_postcode:
A consulta a seguir contém uma expressão COALESCE que avalia tipos definidos pelo usuário diferentes, mas compatíveis, e retorna um valor de um tipo base Snowflake:
A consulta a seguir é igual à anterior, mas converte o resultado no tipo definido pelo usuário positive_number: