SET¶
SET 문은 시스템 파라미터의 값을 지정하거나 사용자 정의 변수의 값을 지정하는 구문이다.
시스템 파라미터¶
SQL 문을 이용하여 CSQL 인터프리터나 CUBRID 매니저의 질의 편집기에서 시스템 파라미터의 값을 설정할 수 있다. 단, 갱신할 수 있는 파라미터는 한정되어 있으므로 주의한다. 갱신할 수 있는 파라미터를 확인하려면 cubrid.conf 설정 파일과 기본 제공 파라미터를 참고한다.
SET SYSTEM PARAMETERS 'parameter_name=value [{; name=value}...]'
value : call_stack_dump_activation_list 파라미터를 제외하고 해당 파라미터의 value를 DEFAULT로 설정하면 기본값으로 재설정된다.
SET SYSTEM PARAMETERS 'lock_timeout=DEFAULT';
사용자 변수¶
사용자 정의 변수는 다음 두 가지 방법으로 생성할 수 있다. 하나는 SET 문을 사용하는 것이고, 다른 하나는 SQL문 내에서 사용자 정의 변수에 값을 할당하는 방식입니다.
정의된 사용자 정의 변수는 DEALLOCATE 또는 DROP VARIABLE 구문을 사용하여 삭제할 수 있다.
사용자 정의 변수는 하나의 응용 프로그램이 연결을 유지하는 동안 사용되는 변수이므로 세션 변수라고도 한다. 이 변수는 연결 세션 범위 내에서만 유효하며, 하나의 응용 프로그램에서 정의된 변수는 다른 응용 프로그램에서 접근할 수 없다.
응용 프로그램이 연결을 종료하면, 모든 변수는 자동으로 제거된다.
사용자 정의 변수는 세션당 최대 20개까지 정의할 수 있으며, 이 제한을 초과하여 새 변수를 생성하려면 DROP VARIABLE 문을 사용해 기존의 사용하지 않는 변수를 먼저 제거해야 한다.
대부분의 SQL 문에서 사용자 정의 변수를 사용할 수 있지만, SELECT 문 내에서 변수의 지정과 참조 순서는 보장되지 않는다. 예를 들어, SELECT 목록에 지정된 사용자 정의 변수를 HAVING, GROUP BY, ORDER BY 절에서 참조하면 예상한 값이 반환되지 않을 수 있다. 또한, 사용자 정의 변수는 컬럼 이름이나 테이블 이름과 같은 식별자(identifier) 로는 사용할 수 없다.
사용자 정의 변수는 대소문자를 구분하지 않는다. 사용자 정의 변수의 타입은 SHORT, INTEGER, BIGINT, FLOAT, DOUBLE, NUMERIC, CHAR, VARCHAR, BIT, BIT VARYING 중 하나가 될 수 있으며, 그 밖의 타입은 VARCHAR 타입으로 변환된다.
SET @v1 = 1, @v2=CAST(1 AS BIGINT), @v3 = '123', @v4 = DATE'2010-01-01';
SELECT typeof(@v1), typeof(@v2), typeof(@v3), typeof(@v4);
typeof(@v1) typeof(@v2) typeof(@v3) typeof(@v4)
======================================================================================
'integer' 'bigint' 'character (-1)' 'character varying (1073741823)
사용자 정의 변수의 타입은 사용자가 값을 지정할 때 변경될 수 있다.
SET @v = 'a';
SET @v1 = 10;
SELECT @v := 1, typeof(@v1), @v1:='1', typeof(@v1);
@v := 1 typeof(@v1) @v1 := '1' typeof(@v1)
======================================================================================
1 'integer' '1' 'character (-1)'
<set_statement>
: <set_statement>, <udf_assignment>
| SET <udv_assignment>
;
<udv_assignment>
: @<name> = <expression>
| @<name> := <expression>
;
{DEALLOCATE|DROP} VARIABLE <variable_name_list>
<variable_name_list>
: <variable_name_list> ',' @<name>
사용자 정의 변수의 이름은 영숫자(alphanumeric)와 언더바(_)로 정의한다.
SQL 문 내에서 사용자 정의 변수를 선언할 때에는 ‘:=’ 연산자를 사용한다.
사용자 정의 변수 a를 선언하고, 값 1을 할당한다.
SET @a = 1;
SELECT @a;
@a
======================
1
사용자 정의 변수를 사용하여 SELECT 문에서 행의 개수를 카운트한다.
CREATE TABLE t (i INTEGER);
INSERT INTO t(i) VALUES(2),(4),(6),(8);
SET @a = 0;
SELECT @a := @a+1 AS row_no, i FROM t;
row_no i
===================================
1 2
2 4
3 6
4 8
4 rows selected.
사용자 정의 변수를 prepared statement에서 지정한 바인드 파라미터의 입력으로 사용한다.
SET @a:=3;
PREPARE stmt FROM 'SELECT i FROM t WHERE i < ?';
EXECUTE stmt USING @a;
i
=============
2
SQL 문 내에서 ‘:=’ 연산자를 사용하여 사용자 정의 변수를 선언한다.
SELECT @a := 1, @user_defined_variable := 'user defined variable';
UPDATE t SET i = (@var := 1);
사용자 정의 변수 a 와 user_defined_variable 를 삭제한다.
DEALLOCATE VARIABLE @a, @user_defined_variable;
DROP VARIABLE @a, @user_defined_variable;
Note
SET 문에 의해 정의되는 사용자 정의 변수는 응용 프로그램이 서버에 연결하면서 시작되어 응용 프로그램이 연결을 종료할 때까지 유지되며, 이 기간동안 유지되는 연결을 세션(session)이라고 한다. 사용자 정의 변수는 응용 프로그램이 연결을 종료하거나 일정 기간 동안 요청이 없어 세션 기간이 만료될(expired) 때 삭제된다. 세션 기간은 cubrid.conf 의 session_state_timeout 파라미터로 설정할 수 있으며, 기본값은 21600 초(=6시간)이다.
세션에서 관리하는 데이터에는 PREPARE 문 외에 사용자 정의 변수, 가장 마지막에 삽입한 ID(LAST_INSERT_ID), 그리고 가장 마지막에 실행한 문장으로 인해 영향을 받은 레코드의 개수(ROW_COUNT)가 포함한다.