SQL 변수

SQL 변수 (SQL variables)

이 문서는 Snowflake 세션에서 SQL 변수를 정의하고 사용하는 방법을 설명해요. SET·UNSET·SHOW VARIABLES 명령, 변수 초기화 방법, SQL에서 변수를 사용하는 법, 그리고 GETVARIABLE 같은 편의 함수를 다루어요.

출처: Snowflake SQL Reference

본문

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;

더 알아보기 (Learn more)