:meta-keywords: cubrid charset, cubrid coercibility, cubrid collation, cubrid current_user, cubrid default, cubrid last_insert_id, cubrid row_count :tocdepth: 3 ********* 정보 함수 ********* .. contents:: CHARSET ======= .. function:: CHARSET(expr) *expr* 의 문자셋을 반환한다. :param expr: 문자셋을 구할 대상 표현식 :rtype: STRING .. code-block:: sql SELECT CHARSET('abc'); :: 'iso88591' .. code-block:: sql SELECT CHARSET(_utf8'abc'); :: 'utf8' .. code-block:: sql SET NAMES utf8; SELECT CHARSET('abc'); :: 'utf8' COERCIBILITY ============ .. function:: COERCIBILITY(expr) *expr*\ 의 콜레이션 변환도(coercibility)를 반환한다. 콜레이션 변환도는 칼럼(표현식)들이 서로 다른 콜레이션과 문자셋을 가지고 있을 때 어떤 콜레이션과 문자셋으로 변환할 것인지를 결정한다. 어떤 연산을 수행하는 두 개의 칼럼(표현식)이 있을 때, 높은 변환도를 가진 인자는 더 낮은 변환도를 가진 인자의 콜레이션으로 변환된다. 이와 관련하여 :ref:`콜레이션 변환도 `\ 를 참고한다. :param expr: 콜레이션 변환도를 구할 대상 표현식 :rtype: INT .. code-block:: sql SELECT COERCIBILITY(USER()); :: 7 .. code-block:: sql SELECT COERCIBILITY(_utf8'abc'); :: 10 COLLATION ========= .. function:: COLLATION(expr) *expr*\ 의 콜레이션을 반환한다. :param expr: 콜레이션을 구할 대상 표현식 :rtype: STRING .. code-block:: sql SELECT COLLATION('abc'); :: 'iso88591_bin' .. code-block:: sql SELECT COLLATION(_utf8'abc'); :: 'utf8_bin' CURRENT_USER, USER ================== .. c:macro:: CURRENT_USER .. c:macro:: USER **CURRENT_USER**\ 와 **USER** 의사 칼럼(pseudo column)은 동일하며, 현재 데이터베이스에 로그인한 사용자의 이름을 문자열로 반환한다. 기능이 비슷한 :func:`SYSTEM_USER` 함수와 :func:`USER` 함수는 사용자 이름을 호스트 이름과 함께 반환한다. :rtype: STRING .. code-block:: sql --selecting the current user on the session SELECT USER; :: CURRENT_USER ====================== 'PUBLIC' .. code-block:: sql SELECT USER(), CURRENT_USER; :: user() CURRENT_USER ============================================ 'PUBLIC@cdbs006.cub' 'PUBLIC' .. code-block:: sql --selecting all users of the current database from the system table SELECT name, id, password FROM db_user; :: name id password ========================================================= 'DBA' NULL NULL 'PUBLIC' NULL NULL 'SELECT_ONLY_USER' NULL db_password 'ALMOST_DBA_USER' NULL db_password 'SELECT_ONLY_USER2' NULL NULL DATABASE, SCHEMA ================ .. function:: DATABASE() .. function:: SCHEMA() **DATABASE** 함수와 **SCHEMA** 함수는 동일하며, 현재 연결된 데이터베이스 이름을 **VARCHAR** 타입의 문자열로 반환한다. :rtype: STRING .. code-block:: sql SELECT DATABASE(), SCHEMA(); :: database() schema() ============================================ 'demodb' 'demodb' DBTIMEZONE ========== .. function:: DBTIMEZONE() 데이터베이스 서버의 타임존(오프셋 또는 지명)을 문자열로 출력한다(예: '-05:00', 또는 'Europe/Vienna'). .. code-block:: sql SELECT DBTIMEZONE(); :: dbtimezone ====================== 'Asia/Seoul' .. seealso:: :func:`SESSIONTIMEZONE`, :func:`FROM_TZ`, :func:`NEW_TIME`, :func:`TZ_OFFSET` DEFAULT ======= .. function:: DEFAULT(column_name) .. c:macro:: DEFAULT **DEFAULT**\ 와 **DEFAULT** 함수는 칼럼에 정의된 기본값을 반환한다. 해당 칼럼에 기본값이 지정되지 않으면 **NULL** 또는 에러를 출력한다. **DEFAULT**\ 는 인자가 없는 반면, **DEFAULT** 함수는 칼럼 이름을 입력 인자로 하는 차이가 있다. **DEFAULT**\ 는 **INSERT** 문의 입력 데이터, **UPDATE** 문의 **SET** 절에서 사용될 수 있고, **DEFAULT** 함수는 모든 곳에서 사용될 수 있다. 기본값이 정의되지 않은 칼럼에 어떠한 제약 조건이 정의되어 있지 않거나 **UNIQUE** 제약 조건이 정의된 경우에는 **NULL**\ 을 반환하고, 해당 칼럼에 **NOT NULL** 또는 **PRIMARY KEY** 제약 조건이 정의된 경우에는 에러를 반환한다. .. code-block:: sql CREATE TABLE info_tbl(id INT DEFAULT 0, name VARCHAR); INSERT INTO info_tbl VALUES (1,'a'),(2,'b'),(NULL,'c'); SELECT id, DEFAULT(id) FROM info_tbl; :: id default(id) ============================= 1 0 2 0 NULL 0 .. code-block:: sql UPDATE info_tbl SET id = DEFAULT WHERE id IS NULL; DELETE FROM info_tbl WHERE id = DEFAULT(id); INSERT INTO info_tbl VALUES (DEFAULT,'d'); .. note:: CUBRID 9.0 미만 버전에서는 테이블 생성 시 DATE, DATETIME, TIME, TIMESTAMP 칼럼의 DEFAULT 값을 SYS_DATE, SYS_DATETIME, SYS_TIME, SYS_TIMESTAMP로 지정하면, CREATE TABLE 시점의 값이 저장된다. 따라서 데이터가 INSERT되는 시점의 값을 입력하려면 INSERT 구문의 VALUES 절에 해당 함수를 입력해야 한다. .. _disk_size: DISK_SIZE ========= .. function:: DISK_SIZE(expr) 이 함수는 *expr* 값을 저장하는 데 필요한 바이트 크기를 반환한다. 주로 데이터베이스 힙 파일에 값을 저장하는 데 필요한 크기를 확인할 때 사용한다. :param expr: 연산식 :rtype: INTEGER .. code-block:: sql SELECT DISK_SIZE('abc'), DISK_SIZE(1); :: disk_size('abc') disk_size(1) ================================== 7 4 값의 실제 내용에 따라 크기가 다르며, :ref:`문자열 압축` 도 고려한다. .. code-block:: sql CREATE TABLE t1(s1 VARCHAR(10), s2 VARCHAR(300), c1 CHAR(10), c2 CHAR(300)); INSERT INTO t1 VALUES(REPEAT('a', 10), REPEAT('b', 300), REPEAT('c', 10), REPEAT('d', 300)); INSERT INTO t1 VALUES('a', 'b', 'c', 'd'); SELECT DISK_SIZE(s1), DISK_SIZE(s2), DISK_SIZE(c1), DISK_SIZE(c2) FROM t1; :: disk_size(s1) disk_size(s2) disk_size(c1) disk_size(c2) ================================================================ 12 24 10 300 4 4 10 300 INDEX_CARDINALITY ================= .. function:: INDEX_CARDINALITY(table, index, key_pos) **INDEX_CARDINALITY** 함수는 테이블에서 인덱스 카디널리티(cardinality)를 반환한다. 인덱스 카디널리티는 인덱스를 정의하는 고유한 값의 개수이다. 인덱스 카디널리티는 다중 칼럼 인덱스의 부분 키에 대해서도 적용할 수 있는데, 이때 세 번째 인자로 칼럼의 위치를 지정하여 부분 키에 대한 고유 값의 개수를 나타낸다. 이 값은 근사치임에 유의한다. 갱신된 결과를 얻으려면 반드시 **UPDATE STATISTICS** 문을 먼저 수행해야 한다. :param table: 테이블 이름 :param index: *table* 내에 존재하는 인덱스 이름 :param key_pos: 부분 키의 위치. *key_pos* 는 0부터 시작하여 키를 구성하는 칼럼 개수보다 작은 범위를 갖는다. 즉, 첫 번째 칼럼의 *key_pos* 는 0이다. 단일 칼럼 인덱스의 경우에는 0이다. 다음 타입 중 하나가 될 수 있다. * 숫자형 타입으로 변환할 수 있는 문자열. * 정수형으로 변환할 수 있는 숫자형 타입. FLOAT나 DOUBLE 타입은 ROUND 함수로 변환한 값이 된다. :rtype: INT 리턴 값은 0 또는 양의 정수이며, 입력 인자 중 하나라도 **NULL** 이면 **NULL** 을 반환한다. 입력 인자인 테이블이나 인덱스가 발견되지 않거나 *key_pos* 가 지정된 범위를 벗어나면 **NULL** 을 리턴한다. .. code-block:: sql CREATE TABLE t1( i1 INTEGER , i2 INTEGER not null, i3 INTEGER unique, s1 VARCHAR(10), s2 VARCHAR(10), s3 VARCHAR(10) UNIQUE); CREATE INDEX i_t1_i1 ON t1(i1 DESC); CREATE INDEX i_t1_s1 ON t1(s1(7)); CREATE INDEX i_t1_i1_s1 on t1(i1,s1); CREATE UNIQUE INDEX i_t1_i2_s2 ON t1(i2,s2); INSERT INTO t1 VALUES (1,1,1,'abc','abc','abc'); INSERT INTO t1 VALUES (2,2,2,'zabc','zabc','zabc'); INSERT INTO t1 VALUES (2,3,3,'+abc','+abc','+abc'); UPDATE STATISTICS ON t1; SELECT INDEX_CARDINALITY('t1','i_t1_i1_s1',0); :: index_cardinality('t1', 'i_t1_i1_s1', 0) =========================================== 2 .. code-block:: sql SELECT INDEX_CARDINALITY('t1','i_t1_i1_s1',1); :: index_cardinality('t1', 'i_t1_i1_s1', 1) =========================================== 3 .. code-block:: sql SELECT INDEX_CARDINALITY('t1','i_t1_i1_s1',2); :: index_cardinality('t1', 'i_t1_i1_s1', 2) =========================================== NULL .. code-block:: sql SELECT INDEX_CARDINALITY('t123','i_t1_i1_s1',1); :: index_cardinality('t123', 'i_t1_i1_s1', 1) ============================================ NULL INET_ATON ========= .. function:: INET_ATON( ip_string ) **INET_ATON** 함수는 IPv4 주소의 문자열을 입력받아 이에 해당하는 숫자를 반환한다. 'a.b.c.d' 형식의 IP 주소 문자열을 입력하면 "a * 256 ^ 3 + b * 256 ^ 2 + c * 256 + d"가 반환된다. 반환 타입은 **BIGINT** 이다. :param ip_string: IPv4 주소 문자열 :rtype: BIGINT 다음 예제에서 192.168.0.10은 "192 * 256 ^ 3 + 168 * 256 ^ 2 + 0 * 256 + 10"으로 계산된다. .. code-block:: sql SELECT INET_ATON('192.168.0.10'); :: inet_aton('192.168.0.10') ============================ 3232235530 INET_NTOA ========= .. function:: INET_NTOA( expr ) **INET_NTOA** 함수는 숫자를 입력받아 IPv4 주소 형식의 문자열을 반환한다. 반환 타입은 **VARCHAR** 이다. :param expr: 숫자 표현식 :rtype: STRING .. code-block:: sql SELECT INET_NTOA(3232235530); :: inet_ntoa(3232235530) ====================== '192.168.0.10' LAST_INSERT_ID ============== .. function:: LAST_INSERT_ID() **LAST_INSERT_ID** 함수는 **AUTO_INCREMENT** 칼럼의 값이 자동 증가할 때 가장 최근에 **INSERT**\ 된 값을 반환한다. :rtype: BIGINT **LAST_INSERT_ID** 함수가 반환하는 값은 다음의 특징을 가진다. * **INSERT** 문 수행에 성공했던 가장 최근의 **LAST_INSERT_ID** 값이 유지된다. **INSERT** 문 수행에 실패하는 경우 **LAST_INSERT_ID**\() 값은 변동이 없으나 **AUTO_INCREMENT** 값은 내부적으로 증가한다. 따라서, 다음 **INSERT** 문 수행이 성공한 이후 **LAST_INSERT_ID**\() 값은 내부적으로 증가된 **AUTO_INCREMENT** 값을 반영한다. .. code-block:: sql CREATE TABLE tbl(a INT PRIMARY KEY AUTO_INCREMENT, b INT UNIQUE); INSERT INTO tbl VALUES (null, 1); INSERT INTO tbl VALUES (null, 1); :: ERROR: Operation would have caused one or more unique constraint violations. .. code-block:: sql INSERT INTO tbl VALUES (null, 1); :: ERROR: Operation would have caused one or more unique constraint violations. .. code-block:: sql SELECT LAST_INSERT_ID(); :: 1 -- In 2008 R4.x, above value was 3. .. code-block:: sql INSERT INTO tbl VALUES (null, 2); SELECT LAST_INSERT_ID(); :: 4 * 다중 행 **INSERT** 문(INSERT INTO tbl VALUES (), (), ..., ())에서 **LAST_INSERT_ID**\ ()는 첫 번째로 입력된 **AUTO_INCREMENT** 값을 반환한다. 즉, 두 번째 행부터는 입력이 되어도 **LAST_INSERT_ID**\ () 값이 변하지 않는다. .. code-block:: sql INSERT INTO tbl VALUES (null, 11), (null, 12), (null, 13); SELECT LAST_INSERT_ID(); :: 5 .. code-block:: sql INSERT INTO tbl VALUES (null, 21); SELECT LAST_INSERT_ID(); :: 8 * **INSERT** 문이 실행에 성공한 경우, **LAST_INSERT_ID** () 값은 트랜잭션이 롤백되어도 예전의 **LAST_INSERT_ID** () 값으로 복구되지 않는다. .. code-block:: sql -- csql> ;autocommit off CREATE TABLE tbl2(a INT PRIMARY KEY AUTO_INCREMENT, b INT UNIQUE); INSERT INTO tbl2 VALUES (null, 1); COMMIT; SELECT LAST_INSERT_ID(); :: 1 .. code-block:: sql INSERT INTO tbl2 VALUES (null, 2); INSERT INTO tbl2 VALUES (null, 3); ROLLBACK; SELECT LAST_INSERT_ID(); :: 3 * 트리거 내에서 사용한 **LAST_INSERT_ID**\ () 값은 트리거 밖에서 확인할 수 없다. * **LAST_INSERT_ID**\ 는 각 응용 클라이언트의 세션마다 독립적으로 유지된다. .. code-block:: sql CREATE TABLE ss (id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, text VARCHAR(32)); INSERT INTO ss VALUES (NULL, 'cubrid'); SELECT LAST_INSERT_ID (); :: last_insert_id() ======================= 1 .. code-block:: sql INSERT INTO ss VALUES (NULL, 'database'), (NULL, 'manager'); SELECT LAST_INSERT_ID (); :: last_insert_id() ======================= 2 .. code-block:: sql CREATE TABLE tbl (id INT AUTO_INCREMENT); INSERT INTO tbl values (500), (NULL), (NULL); SELECT LAST_INSERT_ID(); :: last_insert_id() ======================= 1 .. code-block:: sql INSERT INTO tbl VALUES (500), (NULL), (NULL); SELECT LAST_INSERT_ID(); :: last_insert_id() ======================= 3 .. code-block:: sql SELECT * FROM tbl; :: id ======================= 500 1 2 500 3 4 LIST_DBS ======== .. function:: LIST_DBS() **LIST_DBS** 함수는 디렉터리 파일(**$CUBRID_DATABASES/databases.txt**)에 존재하는 모든 데이터베이스 리스트를 공백 문자로 구분하여 출력한다. :rtype: STRING .. code-block:: sql SELECT LIST_DBS(); :: list_dbs() ====================== 'testdb demodb' ROW_COUNT ========= .. function:: ROW_COUNT() **ROW_COUNT** 함수는 가장 마지막에 수행된 **UPDATE**, **INSERT**, **DELETE**, **REPLACE** 문에 영향을 받는 행의 개수를 정수로 반환한다. **INSERT ON DUPLICATE KEY UPDATE** 문에 의해 INSERT된 각 행은 1을 UPDATE된 행은 각각 2를 반환한다. **REPLACE** 문에 대해서는 DELETE와 INSERT를 합한 개수를 반환한다. 트리거로 인해 수행되는 문장들은 해당 문장의 ROW_COUNT에 영향을 끼치지 않는다. :rtype: INT .. code-block:: sql CREATE TABLE rc (i int); INSERT INTO rc VALUES (1),(2),(3),(4),(5),(6),(7); SELECT ROW_COUNT(); :: row_count() =============== 7 .. code-block:: sql UPDATE rc SET i = 0 WHERE i > 3; SELECT ROW_COUNT(); :: row_count() =============== 4 .. code-block:: sql DELETE FROM rc WHERE i = 0; SELECT ROW_COUNT(); :: row_count() =============== 4 SESSIONTIMEZONE =============== .. function:: SESSIONTIMEZONE() 세션의 타임존(오프셋 또는 지명)을 문자열로 출력한다(예: '-05:00', 또는 'Europe/Vienna'). .. code-block:: sql SELECT SESSIONTIMEZONE(); :: sessiontimezone ====================== 'Asia/Seoul' .. seealso:: :func:`DBTIMEZONE`, :func:`FROM_TZ`, :func:`NEW_TIME`, :func:`TZ_OFFSET` USER, SYSTEM_USER ================= .. function:: USER() .. function:: SYSTEM_USER() **USER** 함수와 **SYSTEM_USER** 함수는 동일하며, 사용자 이름을 호스트 이름과 함께 반환한다. 기능이 비슷한 :c:macro:`USER`\ 와 :c:macro:`CURRENT_USER` 의사 칼럼(pseudo column)은 현재 데이터베이스에 로그인한 사용자의 이름을 문자열로 반환한다. :rtype: STRING .. code-block:: sql --selecting the current user on the session SELECT SYSTEM_USER (); :: user() ====================== 'PUBLIC@cubrid_host' .. code-block:: sql SELECT USER(), CURRENT_USER; :: user() CURRENT_USER ============================================ 'PUBLIC@cubrid_host' 'PUBLIC' .. code-block:: sql --selecting all users of the current database from the system table SELECT name, id, password FROM db_user; :: name id password ========================================================= 'DBA' NULL NULL 'PUBLIC' NULL NULL 'SELECT_ONLY_USER' NULL db_password 'ALMOST_DBA_USER' NULL db_password 'SELECT_ONLY_USER2' NULL NULL VERSION ======= .. function:: VERSION() CUBRID 서버 버전을 나타내는 버전 문자열을 반환한다. :rtype: STRING .. code-block:: sql SELECT VERSION(); :: version() ===================== '9.1.0.0203'