SQL 변수
SQL 변수 (SQL variables)
이 문서는 Snowflake 세션에서 SQL 변수를 정의하고 사용하는 방법을 설명해요. SET·UNSET·SHOW VARIABLES 명령, 변수 초기화 방법, SQL에서 변수를 사용하는 법, 그리고 GETVARIABLE 같은 편의 함수를 다루어요.
본문
Snowflake의 세션에서 SQL 변수를 정의하고 사용할 수 있어요.
개요 (Overview)
Snowflake는 사용자가 선언한 SQL 변수를 지원해요. 애플리케이션별 환경 설정을 저장하는 등 다양한 용도로 사용할 수 있어요.
변수 식별자 (Variable identifiers)
SQL 변수는 대소문자를 구분하지 않는 이름으로 전역적으로 식별돼요.
변수 DDL (Variable DDL)
Snowflake는 SQL 변수를 사용하기 위한 다음 DDL 명령을 제공해요:
- SET
- UNSET
- SHOW VARIABLES
변수 초기화 (Initializing variables)
SQL 문 SET을 실행하거나, Snowflake에 연결할 때 연결 문자열에 변수를 설정해서 변수를 설정할 수 있어요.
문자열 또는 이진 변수의 크기는 16KB로 제한돼요.
SQL을 사용해 세션에서 변수 초기화하기
SET 명령을 사용해 SQL에서 변수를 초기화할 수 있어요. 변수의 데이터 타입은 평가된 표현식 결과의 데이터 타입에서 파생돼요. 다음 예시는 변수를 초기화해요:
SET my_variable1 = 10;
SET my_variable2 = 'example';
단일 결과를 반환하는 쿼리를 사용해서 변수를 초기화할 수 있어요. 다음 예시는 쿼리를 사용해서 변수를 초기화해요:
SET cust_last_name = (SELECT lname FROM customers WHERE customer_id=100);
SET timestamp_variable = (SELECT CURRENT_TIMESTAMP());
같은 문에서 여러 변수를 초기화할 수 있는데, 이렇게 하면 서버와의 왕복 통신 횟수를 줄일 수 있어요. 다음 예시는 여러 변수를 초기화해요:
SET (var1, var2, var3) = (10, 20, 30);
SET (current_user, current_warehouse) = ((SELECT CURRENT_USER()), (SELECT CURRENT_WAREHOUSE()));
연결 시 변수 설정 (Setting variables on connection)
SET을 사용해 세션 내에서 변수를 설정하는 것 외에도, Snowflake에서 세션을 초기화하는 데 사용되는 연결 문자열의 인자로 변수를 전달할 수 있어요. 이 옵션은 연결 문자열의 지정이 유일하게 가능한 사용자 지정인 도구를 사용할 때 특히 유용해요.
예를 들어 Snowflake JDBC 드라이버를 사용하면 매개변수로 해석되는 추가 연결 속성을 설정할 수 있어요. JDBC API는 SQL 변수가 문자열이어야 한다고 요구해요.
// Build connection properties
Properties properties = new Properties();
// Required connection properties
properties.put("user" , "jsmith" );
properties.put("password", "mypassword");
properties.put("account" , "myaccount");
// Set some additional variables.
properties.put("$variable_1", "some example");
properties.put("$variable_2", "1" );
// Create a new connection
String connectStr = "jdbc:snowflake://localhost:8080";
// Open a connection under the snowflake account and enable variable support
Connection con = DriverManager.getConnection(connectStr, properties);
SQL에서 변수 사용하기
변수는 문서에서 달리 표시된 곳을 제외하면 리터럴 상수(literal constant)가 허용되는 Snowflake의 어디에서나 사용할 수 있어요. 바인드 값과 컬럼 이름과 구분하기 위해 모든 변수는 $ 기호로 접두사를 붙여야 해요.
예를 들어:
SET (min, max)=(40, 70);
SELECT $min;
SELECT AVG(salary) FROM emp WHERE age BETWEEN $min AND $max;
참고:
$기호는 SQL 문에서 변수를 식별하는 데 사용되는 접두사이므로, 식별자에 사용될 때 특수 문자로 취급돼요. 식별자(데이터베이스 이름, 테이블 이름, 컬럼 이름 등)는 전체 이름이 큰따옴표로 감싸지 않는 한 특수 문자로 시작할 수 없어요. 자세한 내용은 객체 식별자를 참고하세요.
변수는 테이블 이름 같은 식별자 이름도 담을 수 있어요. 변수를 식별자로 사용하려면 IDENTIFIER()로 감싸야 해요 (예: IDENTIFIER($my_variable)). 아래에 몇 가지 예시가 있어요:
SET my_table_name='table1';
CREATE TABLE IDENTIFIER($my_table_name) (i INTEGER);
INSERT INTO IDENTIFIER($my_table_name) (i) VALUES (42);
SELECT * FROM IDENTIFIER($my_table_name);
+----+
| I |
|----|
| 42 |
+----+
FROM 절의 맥락에서는 변수 이름을 TABLE()로 감쌀 수 있어요:
SELECT * FROM TABLE($my_table_name);
+----+
| I |
|----|
| 42 |
+----+
DROP TABLE IDENTIFIER($my_table_name);
IDENTIFIER()에 대한 자세한 내용은 IDENTIFIER() 문법으로 리터럴과 변수를 식별자로 사용하기를 참고하세요.
세션의 변수 보기 (Viewing variables for the session)
현재 세션에 정의된 모든 변수를 보려면 SHOW VARIABLES 명령을 사용해요:
SET (min, max)=(40, 70);
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SHOW VARIABLES;
+----------------+-------------------------------+-------------------------------+------+-------+-------+---------+
| session_id | created_on | updated_on | name | value | type | comment |
|----------------+-------------------------------+-------------------------------+------+-------+-------+---------|
| 10363773891062 | 2024-06-28 10:09:57.990 -0700 | 2024-06-28 10:09:58.032 -0700 | MAX | 70 | fixed | |
| 10363773891062 | 2024-06-28 10:09:57.990 -0700 | 2024-06-28 10:09:58.021 -0700 | MIN | 40 | fixed | |
+----------------+-------------------------------+-------------------------------+------+-------+-------+---------+
세션 변수 함수 (Session variable functions)
세션 변수를 다루기 위한 편의 함수가 제공돼요. 이 함수들은 다른 데이터베이스 시스템과의 호환성을 지원하고, 변수 접근에 $ 문법을 지원하지 않는 도구를 통해 SQL을 실행하기 위해 제공돼요. 이 모든 함수는 세션 변수 값을 문자열로 받고 반환해요:
- SYS_CONTEXT 및 SET_SYS_CONTEXT
- SESSION_CONTEXT 및 SET_SESSION_CONTEXT
- GETVARIABLE 및 SETVARIABLE
다음은 GETVARIABLE 사용 예시예요. 먼저 SET을 사용해서 변수를 정의해 봐요:
SET var_artist_name = 'Jackson Browne';
+----------------------------------+
| status |
+----------------------------------+
| Statement executed successfully. |
+----------------------------------+
변수 값을 반환해 봐요:
SELECT GETVARIABLE('var_artist_name');
이 예시에서 출력은 NULL이에요. Snowflake는 변수를 모두 대문자로 저장하기 때문이에요.
대소문자를 고쳐 봐요:
SELECT GETVARIABLE('VAR_ARTIST_NAME');
+--------------------------------+
| GETVARIABLE('VAR_ARTIST_NAME') |
+--------------------------------+
| Jackson Browne |
+--------------------------------+
WHERE 절에서 변수 이름을 사용할 수 있어요. 예를 들어:
SELECT album_title
FROM albums
WHERE artist = $var_artist_name;
변수 제거 (Removing variables)
SQL 변수는 세션에만 한정돼요. Snowflake 세션이 닫히면 세션 중에 생성된 모든 변수가 삭제돼요. 즉, 다른 세션에서 설정된 사용자 정의 변수는 아무도 접근할 수 없고, 세션이 닫히면 이 변수들이 만료돼요.
또한 UNSET 명령을 사용해서 변수를 명시적으로 삭제할 수 있어요.
예를 들어:
UNSET my_variable;