Categorias:

Funções de tabela

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:

Construção de SQL no tempo de execução

Sintaxe

TO_QUERY( SQL => '<string>' [ , <arg> => '<value>' [, <arg> => '<value>' ...] ] )
Copy

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:

  • 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'  );
Copy

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';
Copy

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)'));
Copy
+--------+------------+----------+
| 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)'));
Copy
+--------+
| 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'
    )
  );
Copy
+--------+------------+----------+
| 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
    )
  );
Copy
+--------+------------+----------+
| 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'
    )
  );
Copy
+--------+------------+----------+
| 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;
Copy

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;
$$
;
Copy

Chame o procedimento armazenado:

CALL get_num_results_tq('SELECT * FROM to_query_example');
Copy
+----------+
| COUNT(*) |
|----------|
|        4 |
+----------+
CALL get_num_results_tq('SELECT * FROM to_query_example WHERE deptno = 20');
Copy
+----------+
| 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;
Copy

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;
$$
;
Copy

Chame o procedimento armazenado:

CALL get_results_tqbnd('40');
Copy
+--------+------------+--------+
| 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);
Copy
+--------+----------+--------+
| DEPTNO | DNAME    | LOC    |
|--------+----------+--------|
|     20 | RESEARCH | DALLAS |
+--------+----------+--------+