Blocos no Script Snowflake

No Script Snowflake, você escreve código de procedimento dentro de um bloco do Script Snowflake. Este tópico explica como escrever código de procedimento em um bloco.

Neste tópico:

Explicação da estrutura de um bloco

Um bloco tem a seguinte estrutura básica:

DECLARE
  ... (variable declarations, cursor declarations, etc.) ...
BEGIN
  ... (Snowflake Scripting and SQL statements) ...
EXCEPTION
  ... (statements for handling exceptions) ...
END;
Copy

Um bloco consiste de seções (algumas delas opcionais) que são delimitadas por palavras-chave. Cada seção tem uma finalidade diferente:

  • DECLARE: se você precisar usar qualquer variável, cursores etc. no bloco, você pode declará-los na seção DECLARE do bloco ou na seção BEGIN ... END do bloco.

    Você pode declarar:

    Esta seção do bloco é opcional.

  • BEGIN … END: escreva instruções SQL e constructos do Script Snowflake na seção do bloco entre BEGIN e END.

  • EXCEPTION: se você precisar adicionar código de tratamento de exceções, adicione-o à seção EXCEPTION do bloco.

    Esta seção do bloco é opcional.

Um bloco simples requer apenas as palavras-chave BEGIN e END. Por exemplo:

BEGIN
    CREATE TABLE employee (id INTEGER, ...);
    CREATE TABLE dependents (id INTEGER, ...);
END;
Copy

Importante

A palavra-chave BEGIN que inicia um bloco é diferente da palavra-chave BEGIN que inicia uma transação. Para minimizar a confusão, o Snowflake recomenda fortemente iniciar as transações com BEGIN TRANSACTION (ou a forma antiga BEGIN WORK) em vez de simplesmente BEGIN.

Qualquer objeto de banco de dados criado em um bloco (por exemplo, as tabelas do exemplo acima) pode ser usado fora do bloco.

Se o código usar variáveis, você pode declarar essas variáveis no bloco. Uma maneira de fazer isso está na seção DECLARE do bloco. Por exemplo:

DECLARE
    radius_of_circle FLOAT;
    area_of_circle FLOAT;
BEGIN
    radius_of_circle := 3;
    area_of_circle := pi() * radius_of_circle * radius_of_circle;
    RETURN area_of_circle;
END;
Copy

Este exemplo declara uma variável, usa a variável e retorna o valor da variável. (Para obter mais detalhes sobre como valores são retornados de um bloco, consulte Como retornar um valor).

Observe que essas variáveis não podem ser usadas fora do bloco. Consulte Explicação do escopo das declarações.

Você também pode declarar uma variável na seção BEGIN ... END do bloco usando LET. Para obter mais detalhes, consulte Como declarar uma variável.

Como usar um bloco em um procedimento armazenado

Você pode usar um bloco na definição de um procedimento armazenado. A seguir, veja um exemplo que você pode executar em Snowsight para criar um procedimento armazenado contendo um bloco do Script Snowflake:

CREATE OR REPLACE PROCEDURE area()
  RETURNS FLOAT
  LANGUAGE SQL
  AS
    DECLARE
      radius FLOAT;
      area_of_circle FLOAT;
    BEGIN
      radius := 3;
      area_of_circle := PI() * radius * radius;
      RETURN area_of_circle;
    END;
Copy

Observe que se você estiver usando o SnowSQL ou a Classic Console, você deve usar aspas simples ou cifrões duplos para delimitar o bloco, como explicado em Como usar o Script Snowflake no SnowSQL e na Classic Console:

CREATE OR REPLACE PROCEDURE area()
RETURNS FLOAT
LANGUAGE SQL
AS
$$
DECLARE
    radius FLOAT;
    area_of_circle FLOAT;
BEGIN
    radius := 3;
    area_of_circle := PI() * radius * radius;
    RETURN area_of_circle;
END;
$$
;
Copy

Como usar um bloco anônimo

Se você não quiser armazenar o bloco em um procedimento armazenado no banco de dados, você pode definir e usar um bloco anônimo. Um bloco anônimo é um bloco que não faz parte de um procedimento armazenado. Você define o bloco como uma instrução SQL separada e autônoma.

A instrução BEGIN que define o bloco também executa o bloco. (Você não executa um comando separado CALL para executar o bloco).

A seguir, veja um exemplo de um bloco anônimo que você pode executar em Snowsight:

DECLARE
  radius_of_circle FLOAT;
  area_of_circle FLOAT;
BEGIN
  radius_of_circle := 3;
  area_of_circle := PI() * radius_of_circle * radius_of_circle;
  RETURN area_of_circle;
END;
Copy

O exemplo produz a seguinte saída:

+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+
Copy

Note que se você estiver usando o SnowSQL ou a Classic Console, você deve especificar o bloco como uma cadeia de caracteres literal (delimitada por aspas simples ou cifrões duplos) e passar o bloco para o comando EXECUTE IMMEDIATE, como explicado em Como usar o Script Snowflake no SnowSQL e na Classic Console:

EXECUTE IMMEDIATE $$
DECLARE
    radius_of_circle FLOAT;
    area_of_circle FLOAT;
BEGIN
    radius_of_circle := 3;
    area_of_circle := PI() * radius_of_circle * radius_of_circle;
    RETURN area_of_circle;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+
Copy

Observe que o cabeçalho da coluna na saída é “anonymous block” (bloco anônimo); se o código tivesse sido executado em um procedimento armazenado, o cabeçalho da coluna teria sido o nome do procedimento armazenado.

O exemplo a seguir define um bloco anônimo que cria duas tabelas que estão relacionadas. Neste exemplo, o bloco de código de procedimento não precisa usar variáveis; portanto, a seção DECLARE do bloco é omitida.

BEGIN
  CREATE TABLE parent (ID INTEGER);
  CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
  RETURN 'Completed';
END;
Copy
+-----------------+
| anonymous block |
|-----------------|
| Completed       |
+-----------------+
Copy

Nota: se você estiver usando SnowSQL ou Classic Console, use este exemplo (consulte Como usar o Script Snowflake no SnowSQL e na Classic Console):

EXECUTE IMMEDIATE $$
BEGIN
    CREATE TABLE parent (ID INTEGER);
    CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
    RETURN 'Completed';
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| Completed       |
+-----------------+
Copy