카테고리:

테이블 함수

TO_QUERY

SQL 텍스트를 기반으로 한 결과 세트와 SQL 텍스트가 매개 변수화된 경우에는 텍스트에 전달되는 선택적 인자 세트를 반환합니다. 이 함수는 SQL 텍스트를 FROM 절의 하위 쿼리 정의로 컴파일합니다. 애플리케이션이나 저장 프로시저를 작성할 때 이 함수를 호출하여 SQL 문을 구성할 수 있습니다.

참고

이 함수는 쿼리 문에 사용자 입력을 포함할 수 있으며, 그에 따라 SQL 주입과 같은 잠재적인 보안 위험이 있습니다. 외부 소스에서 함수에 대한 입력이 이루어지는 경우, 입력 데이터가 검증되었는지 확인하십시오. 자세한 내용은 SQL 주입 섹션을 참조하십시오.

참고 항목:

런타임에 SQL 구성하기

구문

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

인자

필수 사항

SQL => 'string'

하위 쿼리의 문자열 표현.

선택 사항

arg => 'value'

SQL string 에 전달된 바인드 변수.

반환

지정된 SQL 텍스트 또는 NULL을 실행하여 생성된 결과 세트를 반환합니다. 어느 한 인자라도 NULL이면 함수는 오류를 보고하지 않고 NULL을 반환합니다.

사용법 노트

  • 모든 인자는 다음 중 하나여야 합니다.

  • 인자로 전달된 문자열을 다른 데이터 타입으로 변환해야 하는 경우 SQL string 에서 변환 함수 를 사용하여 문자열을 다른 데이터 타입으로 변환할 수 있습니다.

  • 결과 세트를 정의하는 열 세트는 컴파일된 SQL 문의 SELECT 목록에서 파생됩니다.

  • 이 함수는 SQL 문의 FROM 절에서만 유효합니다.

테이블을 만들고 그 테이블에 데이터를 삽입합니다.

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

예에서는 이 테이블의 데이터를 사용합니다.

SQL 문에서 TO_QUERY 사용하기

먼저, 테이블 이름에 대한 세션 변수(SQL 변수)를 설정합니다.

SET table_name = 'to_query_example';
Copy

예에서는 세션 변수와 IDENTIFIER() 를 사용하여 테이블을 식별합니다.

IDENTIFIER()를 사용하여 데이터베이스 오브젝트를 식별하는 것이 모범 사례인데, 코드의 재사용성을 높이고 SQL 주입 위험을 방지하는 데 도움이 될 수 있기 때문입니다.

다음 예에서는 TO_QUERY 함수를 사용하여 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   |
+--------+------------+----------+

다음 예에서는 TO_QUERY 함수를 사용하여 to_query_example 테이블의 deptno 열에 있는 모든 값을 반환합니다.

SELECT deptno FROM TABLE(TO_QUERY('SELECT * FROM IDENTIFIER($table_name)'));
Copy
+--------+
| DEPTNO |
|--------|
|     10 |
|     20 |
|     30 |
|     40 |
+--------+

다음 예에서는 TO_QUERY 함수를 사용하여 SQL 문에 인자를 전달하여 to_query_example 테이블에서 deptno10 과 같은 행을 반환합니다.

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 |
+--------+------------+----------+

다음 예는 이전 예와 동일하지만, 세션 변수를 사용하여 deptno 값을 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 |
+--------+------------+----------+

다음 예에서는 TO_QUERY 함수를 사용하여 SQL 문에 2개의 인자를 전달하여 to_query_example 테이블에서 deptno10 과 같거나 dnameSALES 와 같은 행을 반환합니다.

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  |
+--------+------------+----------+

저장 프로시저에서 TO_QUERY 사용하기

다음 예제에서는 저장 프로시저에서 TO_QUERY 함수를 사용합니다.

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

참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream 또는 execute_string 메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).

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

저장 프로시저를 호출합니다.

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 |
+----------+

다음 예에서는 바인드 변수가 있는 저장 프로시저에서 TO_QUERY 함수를 사용합니다.

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

참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream 또는 execute_string 메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).

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

저장 프로시저를 호출합니다.

CALL get_results_tqbnd('40');
Copy
+--------+------------+--------+
| DEPTNO | DNAME      | LOC    |
|--------+------------+--------|
|     40 | OPERATIONS | BOSTON |
+--------+------------+--------+

세션 변수를 사용하여 저장 프로시저를 호출합니다.

SET dept = '20';

CALL get_results_tqbnd($dept);
Copy
+--------+----------+--------+
| DEPTNO | DNAME    | LOC    |
|--------+----------+--------|
|     20 | RESEARCH | DALLAS |
+--------+----------+--------+