바인드 변수¶
애플리케이션은 사용자의 데이터를 허용하고 해당 데이터를 SQL 문에서 사용할 수 있습니다. 예를 들어 애플리케이션에서 사용자에게 주소, 전화번호 등의 연락처 정보를 입력하도록 요청할 수 있습니다.
SQL 문에서 이 사용자 입력을 지정하려면 사용자 입력을 문의 다른 부분과 연결하여 SQL 문에 대한 문자열을 프로그래밍 방식으로 구성할 수 있습니다. 또는 바인드 변수 를 사용할 수 있습니다. 변수를 바인딩하려면 SQL 문의 텍스트에 자리 표시자를 1개 이상 추가한 다음 각 자리 표시자에 변수(사용할 변수)를 지정하십시오.
바인드 변수 개요¶
바인드 변수 사용 시, SQL 문의 리터럴을 자리 표시자로 바꿉니다. 예를 들어, 다음 SQL 문은 삽입된 값에 리터럴을 사용합니다.
INSERT INTO t (c1, c2) VALUES (1, 'Test string');
다음 SQL 문은 삽입된 값에 자리 표시자를 사용합니다.
INSERT INTO t (c1, c2) VALUES (?, ?);
애플리케이션 코드는 데이터를 SQL 문의 각 자리 표시자와 바인딩합니다. 자리 표시자를 사용하여 데이터를 바인딩하는 기법은 프로그래밍 언어에 따라 다릅니다. 또한 자리 표시자의 구문은 프로그래밍 언어에 따라 다릅니다. ?
, :varname
또는 %varname
입니다.
Javascript 저장 프로시저에서 바인드 변수 사용하기¶
Javascript 를 사용하여 SQL 을 실행하는 저장 프로시저를 만들 수 있습니다.
Javascript 코드에서 바인드 변수를 지정하려면 ?
자리 표시자를 사용합니다. 예를 들어, 다음 INSERT 문은 테이블 행에 삽입된 값에 대한 바인드 변수를 지정합니다.
INSERT INTO t (col1, col2) VALUES (?, ?)
자바스크립트 코드에서 대부분 SQL 문의 값에는 바인드 변수를 사용할 수 있습니다. 제한 사항에 대한 자세한 내용은 바인드 변수에 대한 제한 사항 섹션을 참조하십시오.
Javascript에서 바인드 변수를 사용하는 방법에 대한 자세한 내용은 변수 바인딩하기 섹션을 참조하십시오.
Snowflake Scripting과 함께 바인드 변수 사용하기¶
Snowflake Scripting 을 사용하여 코드 블록 및 저장 프로시저와 같은 SQL 을 실행하는 절차적 코드를 생성할 수 있습니다. Snowflake Scripting 코드에서 바인드 변수를 지정하려면 변수 이름 앞에 콜론을 접두사로 붙입니다. 예를 들어, 다음 INSERT 문은 variable1
이라는 바인드 변수를 지정합니다.
INSERT INTO t (c1) VALUES (:variable1)
Snowflake Scripting 코드에서 대부분 SQL 문의 값에 바인드 변수를 사용할 수 있습니다. 제한 사항에 대한 자세한 내용은 바인드 변수에 대한 제한 사항 섹션을 참조하십시오.
Snowflake Scripting에서 바인드 변수를 사용하는 방법에 대한 자세한 내용은 SQL 문에서 변수 사용하기(바인딩) 및 SQL 문에서 인자 사용하기(바인딩) 을 참조하십시오.
SQL API와 함께 바인드 변수 사용하기¶
Snowflake SQL API 를 사용하여 Snowflake 데이터베이스의 데이터에 액세스하고 업데이트할 수 있습니다. SQL API를 사용하여 SQL 문을 제출하고 배포를 관리하는 애플리케이션을 만들 수 있습니다.
SQL 문을 실행하는 요청을 제출하면 문의 값에 바인드 변수를 사용할 수 있습니다. 자세한 내용은 문에서 바인드 변수 사용하기 섹션을 참조하십시오.
드라이버와 함께 바인드 변수 사용하기¶
Snowflake 드라이버 를 사용하면 Snowflake에서 작업을 수행하는 애플리케이션을 작성할 수 있습니다. 드라이버는 Go, Java, Python과 같은 프로그래밍 언어를 지원합니다. 특정 드라이버에 대한 애플리케이션의 바인드 변수 사용에 대한 자세한 내용을 보려면 해당 드라이버에 대한 링크를 따르십시오.
참고
PHP 드라이버는 바인드 변수를 지원하지 않습니다.
값 배열과 함께 바인드 변수 사용하기¶
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 열에 유효한 모든 유형의 반정형 데이터를 삽입할 수 있습니다.
바인드 변수에 대한 제한 사항¶
바인드 변수에는 다음과 같은 제한 사항이 적용됩니다.
SELECT 문에 대한 제한 사항:
바인드 변수는 데이터 타입 정의(예:
NUMBER(?)
) 또는 데이터 정렬 사양 (예:COLLATE ?
)의 일부인 숫자를 대체할 수 없습니다.스테이지에 있는 파일을 쿼리하는 SELECT 문의 소스에는 바인드 변수를 사용할 수 없습니다.
DDL 명령의 제한 사항:
다음 DDL 명령에는 바인드 변수를 사용할 수 없습니다.
CREATE/ALTER INTEGRATION
CREATE/ALTER REPLICATION GROUP
CREATE/ALTER PIPE
CREATE TABLE … USING TEMPLATE
다음 절에는 바인드 변수를 사용할 수 없습니다.
ALTER COLUMN
COMMENT ON CONSTRAINT
CREATE/ALTER 명령에는 다음 매개 변수 값에 바인드 변수를 사용할 수 없습니다.
CREDENTIALS
DIRECTORY
ENCRYPTION
IMPORTS
PACKAGES
REFRESH
TAG
외부 테이블에 특정한 매개 변수
바인드 변수는 FILE FORMAT 값의 일부에 해당하는 속성에는 사용할 수 없습니다.
COPY INTO 명령에는 다음 매개 변수 값에 바인드 변수를 사용할 수 없습니다.
CREDENTIALS
ENCRYPTION
FILE_FORMAT
SHOW 명령에서 다음 매개 변수에는 바인드 변수를 사용할 수 없습니다.
LIKE
LIMIT
STARTS WITH
바인드 변수는 EXECUTE IMMEDIATE FROM 명령에 사용할 수 없습니다.
바인드 변수를 사용하는 경우 바인드 변수 값을 한 데이터 타입에서 다른 데이터 타입으로 자동 변환할 수 없습니다.
데이터 타입을 명시적으로 지정하는 Snowflake Scripting 코드
DDL 문
스테이지 이름
바인드 변수에 대한 보안 고려 사항¶
바인드 변수가 모든 경우에 민감한 데이터를 마스킹하는 것은 아닙니다. 예를 들어, 바인드 변수 값이 오류 메시지 및 기타 아티팩트에 표시될 수 있습니다.
바인드 변수는 사용자 입력으로 SQL 문을 구성할 때 SQL 삽입 공격을 방지하는 데 도움이 될 수 있습니다. 그러나 바인드 변수는 보안 위험을 초래할 가능성이 있습니다. SQL 문에 대한 입력이 외부 소스에서 제공된 경우 해당 입력의 유효성을 검사해야 합니다. 자세한 내용은 SQL 주입 섹션을 참조하십시오.