바인드 변수¶
애플리케이션은 사용자의 데이터를 허용하고 해당 데이터를 SQL 문에서 사용할 수 있습니다. 예를 들어 애플리케이션에서 사용자에게 주소, 전화번호 등의 연락처 정보를 입력하도록 요청할 수 있습니다.
SQL 문에서 이 사용자 입력을 지정하려면 사용자 입력을 문의 다른 부분과 연결하여 SQL 문에 대한 문자열을 프로그래밍 방식으로 구성할 수 있습니다. 또는 바인드 변수 를 사용할 수도 있습니다. 변수를 바인딩하려면 SQL 문의 텍스트에 자리 표시자를 1개 이상 추가한 다음 각 자리 표시자에 변수(사용할 변수)를 지정하십시오. 바인드 변수는 사용자 입력으로 SQL 문을 구성할 때 SQL 삽입 공격을 방지할 수 있습니다.
Snowflake에서 다음과 같은 방식으로 바인드 변수를 사용할 수 있습니다.
Snowflake 드라이버 에서 지원하는 API에 대한 호출.
Snowflake Scripting 으로 작성된 절차적 코드.
Snowflake SQL REST API 를 사용하는 애플리케이션.
개요¶
바인드 변수 사용 시, SQL 문의 리터럴을 자리 표시자로 바꿉니다. 예를 들어, 다음 SQL 문은 삽입된 값에 리터럴을 사용합니다.
INSERT INTO t (c1, c2) VALUES (1, 'Test string');
다음 SQL 문은 삽입된 값에 자리 표시자를 사용합니다.
INSERT INTO t (c1, c2) VALUES (?, ?);
애플리케이션 코드는 데이터를 SQL 문의 각 자리 표시자와 바인딩합니다. 자리 표시자를 사용하여 데이터를 바인딩하는 기법은 프로그래밍 언어에 따라 다릅니다. 또한 자리 표시자의 구문은 프로그래밍 언어에 따라 다릅니다. ?
, :<varname>
또는 %<varname>
중 하나입니다.
드라이버와 함께 바인드 변수 사용하기¶
Snowflake 드라이버 를 사용하면 Snowflake에서 작업을 수행하는 애플리케이션을 작성할 수 있습니다. 드라이버는 Go, Java, Python과 같은 프로그래밍 언어를 지원합니다. 특정 드라이버에 대한 애플리케이션의 바인드 변수 사용에 대한 자세한 내용을 보려면 해당 드라이버에 대한 링크를 따르십시오.
참고
PHP 드라이버는 바인드 변수를 지원하지 않습니다.
Snowflake Scripting과 함께 바인드 변수 사용하기¶
Snowflake Scripting을 사용하여 코드 블록 및 저장 프로시저와 같은 SQL을 실행하는 절차적 코드를 생성할 수 있습니다. 변수 이름 앞에 콜론을 붙입니다. 예를 들어, 다음 INSERT 문은 variable1
이라는 바인드 변수를 지정합니다.
INSERT INTO t (c1) VALUES (:variable1)
Snowflake Scripting에서 바인드 변수를 사용하는 방법에 대한 자세한 내용은 SQL 문에서 변수 사용하기(바인딩) 섹션을 참조하십시오.
SQL API와 함께 바인드 변수 사용하기¶
Snowflake SQL REST API 를 사용하여 Snowflake 데이터베이스의 데이터에 액세스하고 업데이트할 수 있습니다. SQL API를 사용하여 SQL 문을 제출하고 배포를 관리하는 애플리케이션을 만들 수 있습니다.
SQL 문을 실행하는 요청을 제출하면 문의 값에 바인드 변수를 사용할 수 있습니다. 자세한 내용은 문에서 바인드 변수 사용하기 섹션을 참조하십시오.
값 배열을 변수에 바인딩하기¶
SQL 문의 변수에 값 배열을 바인딩할 수 있습니다. 이 기법을 사용하면 여러 행을 단일 배치에 삽입하여 네트워크 왕복 및 컴파일을 방지함으로써 성능을 개선할 수 있습니다. 배열 바인드 사용을 “대량 삽입” 또는 “배치 삽입”이라고도 합니다.
참고
Snowflake는 배열 바인드를 사용하는 대신 권장되는 다른 데이터 로딩 방법을 지원합니다. 자세한 내용은 Snowflake에 데이터 로딩하기 및 데이터 로딩 및 언로딩 명령 섹션을 참조하십시오.
다음은 Python 코드의 배열 바인드의 예입니다.
conn = snowflake.connector.connect( ... ) rows_to_insert = [('milk', 2), ('apple', 3), ('egg', 2)] conn.cursor().executemany( "insert into grocery (item, quantity) values (?, ?)", rows_to_insert)
이 예제에서는 바인드 목록 [('milk', 2), ('apple', 3), ('egg', 2)]
를 지정합니다. 애플리케이션이 바인드 목록을 지정하는 방식은 프로그래밍 언어에 따라 다릅니다.
이 코드는 테이블에 세 개의 행을 삽입합니다.
+-------+----+ | C1 | C2 | |-------+----| | milk | 2 | | apple | 3 | | egg | 2 | +-------+----+
특정 드라이버에 대한 애플리케이션의 배열 바인드 사용에 대한 자세한 내용을 보려면 해당 드라이버에 대한 링크를 따르십시오.
참고
PHP 드라이버는 배열 바인드를 지원하지 않습니다.
배열 바인드에 대한 제한 사항¶
배열 바인드에 적용되는 제한 사항은 다음과 같습니다.
INSERT INTO … VALUES 문만 배열 바인드 변수를 포함할 수 있습니다.
VALUES 절은 바인드 변수의 단일 행 목록이어야 합니다. 예를 들어 다음 VALUES 절은 허용되지 않습니다.
VALUES (?,?), (?,?)
배열 바인드를 사용하지 않고 여러 행 삽입하기¶
INSERT 문은 바인드 변수를 사용하여 배열 바인드를 사용하지 않고 여러 행을 삽입할 수 있습니다. 다음 예에서는 두 행에 값을 삽입하지만 배열 바인드를 사용하지 않습니다.
INSERT INTO t VALUES (?,?), (?,?);
애플리케이션은 자리 표시자에 대해 [1,'String1',2,'String2']
값에 해당하는 바인드 목록을 순서대로 지정할 수 있습니다. VALUES 절은 2개 이상의 행을 지정하므로 이 문은 동적인 행의 수 대신 값의 정확한 개수(이 예에서는 4개)만 삽입합니다.
반정형 데이터에 바인드 변수 사용하기¶
변수를 반정형 데이터와 바인딩하려면 변수를 문자열 유형으로 바인딩하고 PARSE_JSON 또는 ARRAY_CONSTRUCT 와 같은 함수를 사용하십시오.
다음 예에서는 하나의 VARIANT 열이 1개 있는 테이블을 만든 다음 PARSE_JSON 함수를 호출하여 바인드 변수가 있는 테이블에 반정형 데이터를 삽입합니다.
CREATE TABLE t (a VARIANT); -- Code that supplies a bind value for ? of '{'a': 'abc', 'x': 'xyz'}' INSERT INTO t SELECT PARSE_JSON(a) FROM VALUES (?);
다음 예에서는 테이블을 쿼리합니다.
SELECT * FROM t;
쿼리에서 반환되는 출력은 다음과 같습니다.
+---------------+ | A | |---------------| | { | | "a": "abc", | | "x": "xyz" | | } | +---------------+
다음 문은 ARRAY_CONSTRUCT 함수를 호출하여 반정형 데이터 배열을 바인드 변수가 있는 VARIANT 열에 삽입합니다.
INSERT INTO t SELECT ARRAY_CONSTRUCT(column1) FROM VALUES (?);
이 두 예제에서는 모두 단일 행을 삽입하거나 배열 바인드를 사용하여 한 배치에 여러 행을 삽입할 수 있습니다. 이 기법을 사용하면 VARIANT 열에 유효한 모든 유형의 반정형 데이터를 삽입할 수 있습니다.