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;
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çãoBEGIN ... 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
eEND
.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;
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;
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;
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;
$$
;
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;
O exemplo produz a seguinte saída:
+-----------------+ | anonymous block | |-----------------| | 28.274333882 | +-----------------+
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 | +-----------------+
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;+-----------------+ | anonymous block | |-----------------| | Completed | +-----------------+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 | +-----------------+