Oracle 21c에 CHECKSUM 함수가 추가되었습니다. CHECKSUM 함수는 집계한 칼럼 값에 대한 체크섬을 반환하며, 로우 셋의 특정 칼럼에 대한 변경 여부를 확인하는 목적으로 사용할 수 있습니다.
CHECKSUM ([ DISTINCT | ALL ] expr) [OVER (analytic_clause)]
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1 NUMBER, c2 NUMBER, c3 VARCHAR2(1));
INSERT INTO t1 VALUES (1, 1, 'A');
INSERT INTO t1 VALUES (2, 1, 'B');
INSERT INTO t1 VALUES (3, 1, 'C');
INSERT INTO t1 VALUES (4, 2, 'C');
INSERT INTO t1 VALUES (5, 2, 'B');
INSERT INTO t1 VALUES (6, 2, 'A');
COMMIT;
아래 쿼리는 CHECKSUM 함수를 사용하여 c2 값의 집계 값에 대한 체크섬을 생성합니다. CHECKSUM 함수에 입력되는 로우 순서와 무관하게 동일한 체크섬이 생성되는 것을 확인할 수 있습니다.
-- 2
SELECT c2
, CHECKSUM (c3) AS cs
FROM t1
GROUP BY c2;
C2 CS
-- ------
1 657052
2 657052
2 행이 선택되었습니다.
아래 예제는 CHECKSUM 함수로 로우 셋의 변경 여부를 확인합니다.
-- 3-1: S1
VAR v_cs_bf NUMBER
EXEC SELECT CHECKSUM (c3) INTO :v_cs_bf FROM t1 WHERE c1 = 1;
-- 3-2: S1
UPDATE t1 SET c3 = 'B' WHERE c1 = 1;
COMMIT;
-- 3-3: S1
VAR v_cs_af NUMBER
EXEC SELECT CHECKSUM (c3) INTO :v_cs_af FROM t1 WHERE c1 = 1;
SET SERVEROUT ON
BEGIN
IF :v_cs_bf != :v_cs_af THEN
DBMS_OUTPUT.PUT_LINE ('CHANGED');
END IF;
END;
/
CHANGED
PL/SQL 처리가 정상적으로 완료되었습니다.
CHECKSUM 함수는 분석 함수로 사용할 수 있습니다.
-- 4
SELECT c1, c2, c3
, CHECKSUM (c3) OVER (PARTITION BY c2) AS cs1
, CHECKSUM (c3) OVER (PARTITION BY c2 ORDER BY c3) AS cs2
FROM t1;
C1 C2 C3 CS1 CS2
-- -- -- ------ ------
1 1 A 657052 493489
2 1 B 657052 88702
3 1 C 657052 657052
6 2 A 657052 493489
5 2 B 657052 88702
4 2 C 657052 657052
6 행이 선택되었습니다.