Blocos no Script Snowflake¶
No Script Snowflake, você escreve código de procedimento em um bloco do Script Snowflake. Este tópico explica como escrever código de procedimento em um bloco.
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;
Um bloco consiste em seções obrigatórias e opcionais que são delimitadas por palavras-chave. Cada seção tem uma finalidade diferente:
DECLARE: se você precisar usar qualquer variável, cursores RESULTSETs ou exceções 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 exige apenas as palavras-chave BEGIN e END. Por exemplo:
BEGIN
CREATE TABLE employee (id INTEGER, ...);
CREATE TABLE dependents (id INTEGER, ...);
END;
Importante
A palavra-chave BEGIN que inicia um bloco é diferente da palavra-chave BEGIN que inicia uma transação. Para minimizar a confusão, a Snowflake recomenda enfaticamente iniciar as transações com BEGIN TRANSACTION (ou a forma mais antiga BEGIN WORK), em vez de 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;
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 Retorno de um valor.
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;
Observação: se você estiver usando o método SnowSQL, o Classic Console, execute_stream
ou execute_string
no código Python Connector, use este exemplo (consulte Uso do Script Snowflake em SnowSQL, Classic Console e conector Python):
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;
$$
;
Você pode chamar um procedimento armazenado usando o comando CALL. O exemplo a seguir chama o procedimento armazenado area
do exemplo anterior:
CALL area();
O procedimento armazenado retorna a seguinte saída:
+--------------+
| AREA |
|--------------|
| 28.274333882 |
+--------------+
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;
Observação: se você estiver usando o método SnowSQL, o Classic Console, execute_stream
ou execute_string
no código Python Connector, use este exemplo (consulte Uso do Script Snowflake em SnowSQL, Classic Console e conector Python):
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;
$$
;
O exemplo produz a seguinte saída:
+-----------------+
| anonymous block |
|-----------------|
| 28.274333882 |
+-----------------+
O cabeçalho da coluna na saída é anonymous block
. 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;
Observação: se você estiver usando o método SnowSQL, o Classic Console, execute_stream
ou execute_string
no código Python Connector, use este exemplo (consulte Uso do Script Snowflake em SnowSQL, Classic Console e conector Python):
EXECUTE IMMEDIATE $$
BEGIN
CREATE TABLE parent (ID INTEGER);
CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
RETURN 'Completed';
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| Completed |
+-----------------+