- 카테고리:
TO_QUERY¶
SQL 텍스트를 기반으로 한 결과 세트와 SQL 텍스트가 매개 변수화된 경우에는 텍스트에 전달되는 선택적 인자 세트를 반환합니다. 이 함수는 SQL 텍스트를 FROM 절의 하위 쿼리 정의로 컴파일합니다. 애플리케이션이나 저장 프로시저를 작성할 때 이 함수를 호출하여 SQL 문을 구성할 수 있습니다.
참고
이 함수는 쿼리 문에 사용자 입력을 포함할 수 있으며, 그에 따라 SQL 주입과 같은 잠재적인 보안 위험이 있습니다. 외부 소스에서 함수에 대한 입력이 이루어지는 경우, 입력 데이터가 검증되었는지 확인하십시오. 자세한 내용은 SQL 주입 섹션을 참조하십시오.
- 참고 항목:
구문¶
TO_QUERY( SQL => '<string>' [ , <arg> => '<value>' [, <arg> => '<value>' ...] ] ) 인자¶
필수 사항
SQL => 'string'하위 쿼리의 문자열 표현.
선택 사항
arg => 'value'SQL
string에 전달된 바인드 변수.
반환¶
지정된 SQL 텍스트 또는 NULL을 실행하여 생성된 결과 세트를 반환합니다. 어느 한 인자라도 NULL이면 함수는 오류를 보고하지 않고 NULL을 반환합니다.
사용법 노트¶
모든 인자는 다음 중 하나여야 합니다.
상수 문자열.
SQL 변수 또는 문자열로 확인되는 Snowflake Scripting 변수.
인자로 전달된 문자열을 다른 데이터 타입으로 변환해야 하는 경우 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' ); 예에서는 이 테이블의 데이터를 사용합니다.
SQL 문에서 TO_QUERY 사용하기¶
먼저, 테이블 이름에 대한 세션 변수(SQL 변수)를 설정합니다.
SET table_name = 'to_query_example'; 예에서는 세션 변수와 IDENTIFIER() 를 사용하여 테이블을 식별합니다.
IDENTIFIER()를 사용하여 데이터베이스 오브젝트를 식별하는 것이 모범 사례인데, 코드의 재사용성을 높이고 SQL 주입 위험을 방지하는 데 도움이 될 수 있기 때문입니다.
다음 예에서는 TO_QUERY 함수를 사용하여 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 | +--------+------------+----------+ 다음 예에서는 TO_QUERY 함수를 사용하여 to_query_example 테이블의 deptno 열에 있는 모든 값을 반환합니다.
SELECT deptno FROM TABLE(TO_QUERY('SELECT * FROM IDENTIFIER($table_name)')); +--------+ | DEPTNO | |--------| | 10 | | 20 | | 30 | | 40 | +--------+ 다음 예에서는 TO_QUERY 함수를 사용하여 SQL 문에 인자를 전달하여 to_query_example 테이블에서 deptno 가 10 과 같은 행을 반환합니다.
SELECT * FROM TABLE( TO_QUERY( 'SELECT * FROM IDENTIFIER($table_name) WHERE deptno = TO_NUMBER(:dno)', dno => '10' ) ); +--------+------------+----------+ | 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 ) ); +--------+------------+----------+ | DEPTNO | DNAME | LOC | |--------+------------+----------| | 10 | ACCOUNTING | NEW YORK | +--------+------------+----------+ 다음 예에서는 TO_QUERY 함수를 사용하여 SQL 문에 2개의 인자를 전달하여 to_query_example 테이블에서 deptno 가 10 과 같거나 dname 이 SALES 와 같은 행을 반환합니다.
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 | +--------+------------+----------+ 저장 프로시저에서 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; 참고: Python Connector 코드에서 Snowflake CLI, SnowSQL, Classic Console, 또는 execute_stream 또는 execute_string 메서드를 사용하는 경우 이 예제를 대신 사용하십시오(Snowflake CLI, 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; $$ ; 저장 프로시저를 호출합니다.
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 | +----------+ 다음 예에서는 바인드 변수가 있는 저장 프로시저에서 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; 참고: Python Connector 코드에서 Snowflake CLI, SnowSQL, Classic Console, 또는 execute_stream 또는 execute_string 메서드를 사용하는 경우 이 예제를 대신 사용하십시오(Snowflake CLI, 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; $$ ; 저장 프로시저를 호출합니다.
CALL get_results_tqbnd('40'); +--------+------------+--------+ | DEPTNO | DNAME | LOC | |--------+------------+--------| | 40 | OPERATIONS | BOSTON | +--------+------------+--------+ 세션 변수를 사용하여 저장 프로시저를 호출합니다.
SET dept = '20'; CALL get_results_tqbnd($dept); +--------+----------+--------+ | DEPTNO | DNAME | LOC | |--------+----------+--------| | 20 | RESEARCH | DALLAS | +--------+----------+--------+