Operadores de fluxo¶
Os operadores de fluxo encadeiam os comandos SQL, em que os resultados de uma instrução servem de entrada para outra instrução. Atualmente, o operador de canal (->>
) é o único operador de fluxo suportado pelo Snowflake.
Canal¶
Os operadores de canal são semelhantes aos canais do Unix (|
) na linha de comando, mas para instruções SQL em vez de comandos Unix. Para usar o operador de canal, especifique uma série de instruções SQL separadas pelo operador. Você pode especificar qualquer instrução SQL válida, como SHOW, SELECT, CREATE, INSERT, e assim por diante. Após a primeira instrução SQL, cada instrução subsequente pode receber os resultados de qualquer instrução anterior como entrada. Na cláusula FROM, uma instrução SQL anterior é referenciada por um parâmetro com o cifrão ($
) e o número do canal, que é a posição relativa da instrução na cadeia de contagem regressiva a partir da instrução atual.
O operador de canal encadeia a seguinte série de instruções SQL e os comentários mostram os números de referência relativos para cada instrução:
first_st -- Referenced as $4 in last_st, $3 in fourth_st, $2 in third_st, and $1 in second_st
->> second_st -- Referenced as $3 in last_st, $2 in fourth_st, and $1 in third_st
->> third_st -- Referenced as $2 in last_st and $1 in fourth_st
->> fourth_st -- Referenced as $1 in last_st
->> last_st;
Por exemplo, essa série de instruções SQL tem uma referência de número de canal em três instruções SELECT, e cada uma delas recebe os resultados da primeira instrução SELECT como entrada:
SELECT ...
->> SELECT ... FROM $1
->> SELECT ... FROM $2
->> SELECT ... FROM $3;
Conforme mostrado, você encerra a cadeia de declarações SQL colocando um ponto e vírgula após a última instrução. Não coloque um ponto e vírgula após as instruções anteriores na cadeia. A saída de toda a cadeia é o resultado final da última instrução SQL. Ferramentas de cliente, como SnowSQL, tratam a cadeia de instruções como uma única instrução.
O operador de canal oferece os seguintes benefícios:
Simplifica a execução de instruções dependentes do SQL.
Melhora a legibilidade e a flexibilidade de operações complexas de SQL.
Sintaxe¶
<sql_statement_1> ->> <sql_statement_2> [ ->> <sql_statement_n> ... ]
Notas de uso¶
Cada instrução produz um resultado que só pode ser consumido por uma instrução subsequente na cadeia.
As instruções são executadas na ordem especificada. Ao contrário de
RESULT_SCAN(LAST_QUERY_ID())
, o número do canal resolve para o conjunto de resultados correto na cadeia, independentemente de outras consultas terem sido executadas simultaneamente fora da cadeia ou não.Quando uma instrução consome os resultados de uma instrução anterior, o conjunto de resultados consumido é equivalente ao conjunto de resultados retornado pela função RESULT_SCAN que recebeu o ID da consulta da instrução anterior.
Por exemplo, essas instruções limitam a saída do comando SHOW WAREHOUSES a colunas específicas:
SHOW WAREHOUSES; SELECT "name", "state", "type", "size" FROM TABLE(RESULT_SCAN(LAST_QUERY_ID(-1)));
Essa instrução usa o operador do canal para produzir os mesmos resultados:
SHOW WAREHOUSES ->> SELECT "name", "state", "type", "size" FROM $1;
Não é garantido que uma consulta que usa o operador do canal retorne linhas na mesma ordem que o conjunto de resultados de entrada de uma consulta anterior na cadeia. Você pode incluir uma cláusula ORDER BY na consulta para especificar a ordem.
Um erro gerado por qualquer instrução SQL interrompe a execução da cadeia, e esse erro é retornado ao cliente.
O resultado da última instrução é retornado ao cliente.
As instruções são executadas como um bloco anônimo do Snowflake Scripting.
Limitações¶
O parâmetro
$n
só é válido na cláusula FROM de uma instrução SQL.Cada instrução SQL produz um resultado que só pode ser consumido por uma instrução subsequente na cadeia de canais. Os resultados não podem ser consumidos fora da cadeia de canais, exceto os resultados da última instrução.
Não há suporte para variáveis de vinculação posicional.
Exemplos¶
Os exemplos a seguir usam o operador de canal:
Selecione uma lista de colunas para a saída de um comando SHOW
Execução de consultas que recebem entradas de consultas em várias tabelas
Retorno da contagem de linhas para as operações do DML em uma transação
Retorno dos resultados das inserções em uma tabela que será descartada posteriormente
Selecione uma lista de colunas para a saída de um comando SHOW¶
Execute um comando SHOW TABLES e use o operador de canal para limitar a saída às colunas created_on
, name
e owner
para tabelas criadas após 15 de abril de 2025.
SHOW TABLES
->> SELECT "created_on" AS creation_date,
"name" AS table_name,
"owner" AS table_owner
FROM $1
WHERE creation_date > '2025-04-15'::DATE;
+-------------------------------+-------------+--------------+
| CREATION_DATE | TABLE_NAME | TABLE_OWNER |
|-------------------------------+-------------+--------------|
| 2025-04-16 08:46:16.130 -0700 | TEST_TABLE1 | ACCOUNTADMIN |
| 2025-04-16 09:44:13.701 -0700 | MYTABLE1 | USER_ROLE |
| 2025-04-16 08:46:32.092 -0700 | MYTABLE2 | USER_ROLE |
+-------------------------------+-------------+--------------+
Execução de consultas que recebem entradas de consultas em várias tabelas¶
Primeiro, crie uma tabela dept_pipe_demo
e uma tabela emp_pipe_demo
e insira dados em cada uma delas:
CREATE OR REPLACE TABLE dept_pipe_demo (
deptno NUMBER(2),
dname VARCHAR(14),
loc VARCHAR(13)
) AS SELECT * FROM VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');
CREATE OR REPLACE TABLE emp_pipe_demo (
empno NUMBER(4),
ename VARCHAR(10),
sal NUMBER(7,2),
deptno NUMBER(2)
) AS SELECT * FROM VALUES
(7369, 'SMITH', 800, 20),
(7499, 'ALLEN', 1600, 30),
(7521, 'WARD', 1250, 30),
(7698, 'BLAKE', 2850, 30),
(7782, 'CLARK', 2450, 10);
O exemplo a seguir usa o operador de canal para uma cadeia de instruções SQL que executam as seguintes operações:
Consulte a tabela
dept_pipe_demo
para retornar as linhas em quedname
é igual aSALES
.Consulte na tabela
emp_pipe_demo
os funcionários com salário maior que1500
no departamentoSALES
, usando os resultados da consulta anterior como entrada, especificando$1
na condição WHERE de uma cláusula FROM.Execute uma consulta que retorne os valores
ename
esal
usando os resultados da consulta anterior como entrada, especificando$1
na cláusula FROM.
SELECT * FROM dept_pipe_demo WHERE dname = 'SALES'
->> SELECT * FROM emp_pipe_demo WHERE sal > 1500 AND deptno IN (SELECT deptno FROM $1)
->> SELECT ename, sal FROM $1 ORDER BY 2 DESC;
+-------+---------+
| ENAME | SAL |
|-------+---------|
| BLAKE | 2850.00 |
| ALLEN | 1600.00 |
+-------+---------+
Nota
O objetivo deste exemplo é mostrar como combinar uma série de consultas com o operador do canal. No entanto, a mesma saída pode ser obtida com uma consulta de junção, e as consultas de junção normalmente têm um desempenho melhor do que as consultas combinadas com o operador do canal.
Retorno da contagem de linhas para as operações do DML em uma transação¶
Crie uma tabela e insira as linhas uma a uma. O encadeamento de todas as instruções permite que você use o operador de canal para examinar o resultado de cada instrução INSERT, que representa o número total de linhas inseridas.
Em cada uma das instruções SELECT do exemplo, o $1
na lista SELECT é uma referência abreviada para a primeira coluna, não um resultado anterior no canal. O parâmetro $n
para um número de canal só é válido na cláusula FROM.
CREATE OR REPLACE TABLE test_sql_pipe_dml (a INT, b INT)
->> INSERT INTO test_sql_pipe_dml VALUES (1, 2)
->> INSERT INTO test_sql_pipe_dml VALUES (3, 4)
->> INSERT INTO test_sql_pipe_dml VALUES (5, 6)
->> INSERT INTO test_sql_pipe_dml VALUES (7, 8)
->> SELECT (SELECT $1 FROM $4) +
(SELECT $1 FROM $3) +
(SELECT $1 FROM $2) +
(SELECT $1 FROM $1)
AS "Number of rows";
+----------------+
| Number of rows |
|----------------|
| 4 |
+----------------+
O exemplo a seguir usa o operador de canal para uma cadeia de instruções SQL que executam as seguintes operações:
Iniciar uma transação.
Inserir uma linha na tabela criada anteriormente.
Excluir linhas da tabela.
Atualizar as linhas da tabela.
Confirmar a transação.
Consultar o número de linhas que foram afetadas por cada operação do DML.
EXECUTE IMMEDIATE $$
BEGIN TRANSACTION
->> INSERT INTO test_sql_pipe_dml VALUES (1, 2)
->> DELETE FROM test_sql_pipe_dml WHERE a = 1
->> UPDATE test_sql_pipe_dml SET b = 2
->> COMMIT
->> SELECT
(SELECT $1 FROM $4) AS "Inserted rows",
(SELECT $1 FROM $3) AS "Deleted rows",
(SELECT $1 FROM $2) AS "Updated rows";
$$;
+---------------+--------------+--------------+
| Inserted rows | Deleted rows | Updated rows |
|---------------+--------------+--------------|
| 1 | 2 | 3 |
+---------------+--------------+--------------+
Retorno dos resultados das inserções em uma tabela que será descartada posteriormente¶
Este exemplo usa o operador de canal para uma cadeia de instruções SQL que executa as seguintes operações:
Criar uma tabela com uma coluna IDENTITY.
Inserir linhas na tabela.
Consultar a tabela.
Descartar a tabela.
Consultar os resultados do canal número
$2
(a instrução SELECT).
O conjunto de resultados consumido na última instrução SELECT é equivalente ao conjunto de resultados retornado pela função RESULT_SCAN para o ID da consulta da instrução SELECT anterior.
CREATE OR REPLACE TABLE test_sql_pipe_drop (
id INT IDENTITY START 10 INCREMENT 1,
data VARCHAR)
->> INSERT INTO test_sql_pipe_drop (data) VALUES ('row1'), ('row2'), ('row3')
->> SELECT * FROM test_sql_pipe_drop
->> DROP TABLE test_sql_pipe_drop
->> SELECT COUNT(*) "Number of rows", MAX(id) AS "Last ID" FROM $2;
+----------------+---------+
| Number of rows | Last ID |
|----------------+---------|
| 3 | 12 |
+----------------+---------+