19c까지 ORA_HASH 함수는 CLOB 값에 대해 무작위 해시 값을 반환합니다.
아래는 SQL Language Reference의 ORA_HASH 함수에 대한 내용입니다. 원칙적으로 ORA_HASH 함수는 LOB 타입을 사용할 수 없습니다.
The expr argument determines the data for which you want Oracle Database to compute a hash value. There are no restrictions on the length of data represented by expr, which commonly resolves to a column name. The expr cannot be a LONG or LOB type. It cannot be a user-defined object type unless it is a nested table type. The hash value for nested table types does not depend on the order of elements in the collection. All other data types are supported for expr.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다. c2 칼럼은 VARCHAR2 타입, c3 칼럼은 CLOB 타입입니다.
-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2(4000), c3 CLOB);
INSERT INTO t1 VALUES (1, LPAD ('X', 4000, 'X'), LPAD ('X', 4000, 'X'));
INSERT INTO t1 VALUES (2, LPAD ('X', 4000, 'X'), LPAD ('X', 4000, 'X'));
COMMIT;
아래 쿼리를 수행하면 VARCHAR2 타입인 c2 칼럼은 동일한 값을 반환하지만, CLOB 타입인 c3 칼럼은 무작위 값을 반환하는 것을 확인할 수 있습니다.
-- 2-1: 19.3
SELECT c1
, ORA_HASH (c2) AS c2
, ORA_HASH (c3) AS c3
FROM t1;
C1 C2 C3
-- ---------- ----------
1 1235804801 3023040963
2 1235804801 2134118016
2 행이 선택되었습니다.
-- 2-2: 19.3
/
C1 C2 C3
-- ---------- ----------
1 1235804801 3009915611
2 1235804801 1820346920
2 행이 선택되었습니다.
ORA_HASH 함수 대신 DBMS_CRYPTO.HASH 함수를 사용하면 동일한 값이 반환됩니다.
-- 3-1: 19.3
SELECT c1
, DBMS_CRYPTO.HASH (c3, 1) AS c3
FROM t1;
C1 C3
-- ---------------------------------
1 5E33987B542F4BA29C2574E53EC03FB8
2 5E33987B542F4BA29C2574E53EC03FB8
2 행이 선택되었습니다.
-- 3-2: 19.3
/
C1 C3
-- ---------------------------------
1 5E33987B542F4BA29C2574E53EC03FB8
2 5E33987B542F4BA29C2574E53EC03FB8
2 행이 선택되었습니다.
참고로 21c부터 ORA_HASH 함수에 CLOB 타입을 사용하면 에러가 발생합니다.
-- 3: 21.3
SELECT ORA_HASH (c3) AS c3
FROM t1;
ORA-00932: 일관성 없는 데이터 유형: -이(가) 필요하지만 CLOB임
관련 링크