DECLARE (Script Snowflake)

Declara uma ou mais variáveis, cursores, RESULTSETs, procedimentos armazenados aninhados ou exceções do Script Snowflake.

Para obter mais informações, consulte os seguintes tópicos:

Consulte também:

LET

Sintaxe

DECLARE
  {   <variable_declaration>
    | <cursor_declaration>
    | <resultset_declaration>
    | <nested_stored_procedure_declaration>
    | <exception_declaration> };
  [
    {   <variable_declaration>
      | <cursor_declaration>
      | <resultset_declaration>
      | <nested_stored_procedure_declaration>
      | <exception_declaration> };
    ...
  ]
Copy

As seções seguintes descrevem a sintaxe para cada tipo de instrução com mais detalhes:

Sintaxe da instrução variável

Use a seguinte sintaxe para declarar uma variável:

<variable_declaration> ::=
  <variable_name> [<type>] [ { DEFAULT | := } <expression>]
Copy

Onde:

variable_name

O nome da variável. O nome deve seguir as regras de nomenclatura para Identificadores de objetos.

type

Um tipo de dados SQL.

DEFAULT expression ou . := expression

Atribui o valor de expression à variável. Se ambos type e expression forem especificados, a expressão deve ser avaliada como um tipo de dados que corresponda, ou pode ser implicitamente convertida no type especificado.

Por exemplo:

profit NUMBER(38, 2) := 0;
Copy

Para um exemplo completo, consulte Exemplos.

Para obter mais informações sobre variáveis, consulte Como trabalhar com variáveis.

Sintaxe da instrução do cursor

Use a seguinte sintaxe para declarar um cursor.

<cursor_declaration> ::=
  <cursor_name> CURSOR FOR <query>
Copy

Onde:

cursor_name

O nome a ser dado ao cursor. Ele pode ser qualquer identificador válido do Snowflake que ainda não esteja em uso neste bloco. O identificador é usado por outros comandos relacionados ao cursor, tais como FETCH.

query

A consulta que define o conjunto de resultados sobre os quais o cursor faz iteração.

Isso pode ser quase qualquer instrução SELECT válida. Para especificar parâmetros de vinculação na instrução SELECT, use pontos de interrogação (?). Você pode vincular os parâmetros para vincular variáveis na cláusula USING quando você abre o cursor.

Por exemplo:

c1 CURSOR FOR SELECT id, price FROM invoices;
Copy

Para obter mais informações sobre cursores (incluindo exemplos completos), consulte Como trabalhar com cursores.

Sintaxe da instrução RESULTSET

Use a seguinte sintaxe para declarar um RESULTSET.

<resultset_name> RESULTSET [ { DEFAULT | := } [ ASYNC ] ( <query> ) ] ;
Copy

Onde:

resultset_name

O nome a ser dado ao RESULTSET.

O nome deve ser único dentro do escopo atual.

O nome deve seguir as regras de nomenclatura para Identificadores de objetos.

ASYNC

Executa a consulta como um trabalho filho assíncrono.

A consulta pode ser qualquer instrução SQL válida, incluindo instruções SELECT e instruções DML, como INSERT ou UPDATE.

Quando essa palavra-chave é omitida, o procedimento armazenado executa os trabalhos secundários sequencialmente, e cada trabalho secundário aguarda a conclusão do trabalho secundário em execução antes de iniciar.

É possível usar essa palavra-chave para executar vários trabalhos secundários simultaneamente, o que pode aumentar a eficiência e reduzir o tempo total de execução.

É possível usar as instruções AWAIT e CANCEL para gerenciar trabalhos filho assíncronos para um RESULTSET.

DEFAULT query ou . := query

Atribui o valor de query a RESULTSET.

Por exemplo:

res RESULTSET DEFAULT (SELECT col1 FROM mytable ORDER BY col1);
Copy

Para obter mais informações sobre RESULTSETs (incluindo exemplos completos), consulte Como trabalhar com RESULTSETs.

Sintaxe da instrução do procedimento armazenado aninhado

Use a seguinte sintaxe para declarar um procedimento armazenado aninhado:

<nested_procedure_name> PROCEDURE (
    [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS { <result_data_type> | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
  AS <nested_procedure_definition>
Copy

Onde:

nested_procedure_name

O nome do procedimento armazenado aninhado. O nome deve seguir as regras de nomenclatura para Identificadores de objetos.

( [ arg_name arg_data_type ] [ , ... ] )

Especifica os argumentos de entrada para o procedimento armazenado aninhado.

  • Para arg_name, especificar o nome do argumento de entrada.

  • Para arg_data_type, especifique um tipo de dados SQL.

RETURNS { result_data_type | TABLE ( [ col_name col_data_type [ , ... ] ] ) }

Especifica o tipo do resultado retornado pelo procedimento armazenado. Atualmente, NOT NULL não é compatível no parâmetro RETURNS para procedimentos armazenados aninhados.

  • Para RETURNS result_data_type, especifique um tipo de dados SQL.

  • Para RETURNS TABLE ( [ col_name col_data_type [ , ... ] ] ), se você conhecer os tipo de dados Snowflake das colunas na tabela retornada, especificar os nomes e tipos das colunas:

    RETURNS TABLE (sales_date DATE, quantity NUMBER)
    
    Copy

    Caso contrário (por exemplo, se você estiver determinando os tipos de coluna durante o tempo de execução), você pode omitir os nomes e tipos de coluna:

    RETURNS TABLE ()
    
    Copy

    Nota

    Atualmente, na cláusula RETURNS TABLE(...), você não pode especificar GEOGRAPHY como um tipo de coluna. Isso se aplica se você estiver criando um procedimento armazenado ou anônimo.

    CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
      RETURNS TABLE(g GEOGRAPHY)
      ...
    
    Copy
    WITH test_return_geography_table_1() AS PROCEDURE
      RETURNS TABLE(g GEOGRAPHY)
      ...
    CALL test_return_geography_table_1();
    
    Copy

    Se você tentar especificar GEOGRAPHY como um tipo de coluna, chamar o procedimento armazenado resultará no erro:

    Stored procedure execution error: data type of returned table does not match expected returned table type
    
    Copy

    Para contornar este problema, você pode omitir os argumentos da coluna e digitar RETURNS TABLE().

    CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
      RETURNS TABLE()
      ...
    
    Copy
    WITH test_return_geography_table_1() AS PROCEDURE
      RETURNS TABLE()
      ...
    CALL test_return_geography_table_1();
    
    Copy
AS nested_procedure_definition

Define o código executado pelo procedimento armazenado aninhado. A definição pode consistir em qualquer código válido.

Sintaxe da instrução de exceção

Use a seguinte sintaxe para declarar uma exceção.

<exception_name> EXCEPTION [ ( <exception_number> , '<exception_message>' ) ] ;
Copy

Onde:

exception_name

O nome a ser dado à exceção.

exception_number

Um número para identificar a exceção de forma única. O número deve ser um número inteiro entre -20000 e -20999. O número não deve ser utilizado para nenhuma outra exceção que exista ao mesmo tempo.

Padrão: -20000

exception_message

Uma mensagem para descrever a exceção. A mensagem não deve conter nenhum caractere de aspas duplas.

Padrão: cadeia de caracteres vazia.

Por exemplo:

exception_could_not_create_table EXCEPTION (-20003, 'ERROR: Could not create table.');
Copy

Para obter mais informações sobre exceções (incluindo exemplos completos), consulte Tratamento de exceções.

Exemplos

Este exemplo declara uma variável chamada profit para uso em um bloco anônimo do Snowflake Scripting:

DECLARE
  profit number(38, 2) DEFAULT 0.0;
BEGIN
  LET cost number(38, 2) := 100.0;
  LET revenue number(38, 2) DEFAULT 110.0;

  profit := revenue - cost;
  RETURN profit;
END;
Copy

Observação: se você usar o Snowflake CLI, SnowSQL, o Classic Console, ou o método execute_stream ou execute_string no código Python Connector, use este exemplo (consulte Usar o Snowflake Scripting no Snowflake CLI, SnowSQL, Classic Console e Python Connector):

EXECUTE IMMEDIATE 
$$
DECLARE
  profit number(38, 2) DEFAULT 0.0;
BEGIN
  LET cost number(38, 2) := 100.0;
  LET revenue number(38, 2) DEFAULT 110.0;

  profit := revenue - cost;
  RETURN profit;
END;
$$
;
Copy

Para mais exemplos que declaram variáveis, cursores, RESULTSETs e exceções, consulte os seguintes tópicos: