- Categorias:
TO_QUERY¶
Retorna um conjunto de resultados com base no texto SQL e um conjunto opcional de argumentos que são passados para o texto SQL se ele for parametrizado. A função compila o texto SQL como a definição de uma subconsulta na cláusula FROM. Ao escrever um aplicativo ou um procedimento armazenado, é possível chamar esta função para construir uma instrução SQL.
Nota
Esta função pode incluir entrada do usuário em instruções de consulta, o que apresenta riscos potenciais de segurança, como injeção de SQL. Se as entradas para a função vierem de fontes externas, certifique-se de que elas sejam validadas. Para obter mais informações, consulte Injeção de SQL.
- Consulte também:
Sintaxe¶
TO_QUERY( SQL => '<string>' [ , <arg> => '<value>' [, <arg> => '<value>' ...] ] )
Argumentos¶
Obrigatório
SQL => 'string'
Representação de cadeia de caracteres da subconsulta.
Opcional
arg => 'value'
Vinculação de variáveis passadas para a
string
SQL.
Retornos¶
Retorna o conjunto de resultados produzido pela execução do texto SQL especificado ou NULL. Se algum argumento for NULL, a função retorna NULL sem relatar nenhum erro.
Notas de uso¶
Todos os argumentos devem ser um dos seguintes:
Cadeias de caracteres constantes.
Variáveis SQL ou variáveis do Snowflake Scripting que são resolvidas em cadeias de caracteres.
Se você precisar converter uma cadeia de caracteres passada em um argumento para um tipo de dados diferente, é possível usar uma função de conversão na
string
SQL para converter a cadeia de caracteres para outro tipo de dados.O conjunto de colunas que define o conjunto de resultados é derivado da lista SELECT da instrução SQL compilada.
A função é válida somente na cláusula FROM de uma instrução SQL.
Exemplos¶
Crie uma tabela e insira dados nela.
CREATE OR REPLACE TABLE to_query_example (
deptno NUMBER(2),
dname VARCHAR(14),
loc VARCHAR(13))
AS SELECT
column1,
column2,
column3
FROM
VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS' ),
(30, 'SALES', 'CHICAGO' ),
(40, 'OPERATIONS', 'BOSTON' );
Os exemplos usam os dados desta tabela.
Como usar TO_QUERY em instruções SQL¶
Primeiro, defina uma variável de sessão (variável SQL) para o nome da tabela:
SET table_name = 'to_query_example';
Os exemplos usam a variável de sessão e IDENTIFIER() para identificar a tabela.
Usar IDENTIFIER() para identificar objetos de banco de dados é uma prática recomendada porque pode tornar o código mais reutilizável e ajudar a evitar riscos de injeção SQL.
O exemplo a seguir usa a função TO_QUERY para retornar todos os dados na tabela to_query_example
:
SELECT * FROM TABLE(TO_QUERY('SELECT * FROM IDENTIFIER($table_name)'));
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
|--------+------------+----------|
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
O exemplo a seguir usa a função TO_QUERY para retornar todos os valores na coluna deptno
da tabela to_query_example
:
SELECT deptno FROM TABLE(TO_QUERY('SELECT * FROM IDENTIFIER($table_name)'));
+--------+
| DEPTNO |
|--------|
| 10 |
| 20 |
| 30 |
| 40 |
+--------+
O exemplo a seguir usa a função TO_QUERY para passar um argumento para uma instrução SQL para que ela retorne a linha onde deptno
é igual a 10
na tabela to_query_example
:
SELECT * FROM TABLE(
TO_QUERY(
'SELECT * FROM IDENTIFIER($table_name)
WHERE deptno = TO_NUMBER(:dno)', dno => '10'
)
);
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
|--------+------------+----------|
| 10 | ACCOUNTING | NEW YORK |
+--------+------------+----------+
O exemplo a seguir é o mesmo que o exemplo anterior, mas usa uma variável de sessão para passar o valor deptno
para a função TO_QUERY:
SET dept = '10';
SELECT * FROM TABLE(
TO_QUERY(
'SELECT * FROM IDENTIFIER($table_name)
WHERE deptno = TO_NUMBER(:dno)', dno => $dept
)
);
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
|--------+------------+----------|
| 10 | ACCOUNTING | NEW YORK |
+--------+------------+----------+
O exemplo a seguir usa a função TO_QUERY para passar dois argumentos para uma instrução SQL para que ela retorne as linhas onde deptno
é igual a 10
ou dname
é igual a SALES
na tabela to_query_example
:
SELECT * FROM TABLE(
TO_QUERY(
'SELECT * FROM IDENTIFIER($table_name)
WHERE deptno = TO_NUMBER(:dno) OR dname = :dnm',
dno => '10', dnm => 'SALES'
)
);
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
|--------+------------+----------|
| 10 | ACCOUNTING | NEW YORK |
| 30 | SALES | CHICAGO |
+--------+------------+----------+
Como usar TO_QUERY em procedimentos armazenados¶
O exemplo a seguir usa a função TO_QUERY em um procedimento armazenado:
CREATE OR REPLACE PROCEDURE get_num_results_tq(query VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
DECLARE
res RESULTSET DEFAULT (SELECT COUNT(*) FROM TABLE(TO_QUERY(:query)));
BEGIN
RETURN TABLE(res);
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 get_num_results_tq(query VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
$$
DECLARE
res RESULTSET DEFAULT (SELECT COUNT(*) FROM TABLE(TO_QUERY(:query)));
BEGIN
RETURN TABLE(res);
END;
$$
;
Chame o procedimento armazenado:
CALL get_num_results_tq('SELECT * FROM to_query_example');
+----------+
| COUNT(*) |
|----------|
| 4 |
+----------+
CALL get_num_results_tq('SELECT * FROM to_query_example WHERE deptno = 20');
+----------+
| COUNT(*) |
|----------|
| 1 |
+----------+
O exemplo a seguir usa a função TO_QUERY em um procedimento armazenado com uma variável de vinculação:
CREATE OR REPLACE PROCEDURE get_results_tqbnd(dno VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
DECLARE
res RESULTSET DEFAULT (SELECT * FROM TABLE(
TO_QUERY(
'SELECT * FROM to_query_example
WHERE deptno = TO_NUMBER(:dnoval)', dnoval => :dno
)
));
BEGIN
RETURN TABLE(res);
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 get_results_tqbnd(dno VARCHAR)
RETURNS TABLE ()
LANGUAGE SQL
AS
$$
DECLARE
res RESULTSET DEFAULT (SELECT * FROM TABLE(
TO_QUERY(
'SELECT * FROM to_query_example
WHERE deptno = TO_NUMBER(:dnoval)', dnoval => :dno
)
));
BEGIN
RETURN TABLE(res);
END;
$$
;
Chame o procedimento armazenado:
CALL get_results_tqbnd('40');
+--------+------------+--------+
| DEPTNO | DNAME | LOC |
|--------+------------+--------|
| 40 | OPERATIONS | BOSTON |
+--------+------------+--------+
Chame o procedimento armazenado usando uma variável de sessão:
SET dept = '20';
CALL get_results_tqbnd($dept);
+--------+----------+--------+
| DEPTNO | DNAME | LOC |
|--------+----------+--------|
| 20 | RESEARCH | DALLAS |
+--------+----------+--------+