我有一个函数,计算大字符串的哈希值!首先,我写了一个游标T1_CUT,它可以包含SELECT语句的变量计数,如:
SELECT T1.COL1||T1.COL2||...||T1.COLn FROM T1 WHERE id=documentid SELECT T2.COL1||T2.COL2||...||T2.COLn FROM T2 WHERE id=documentid ... SELECT Tn.COL1||Tn.COL2||...||Tn.COLn FROM Tn WHERE id=documentid
每个SELECT都可以包含一行或多行.因此,我将每个SELECT和ALL SELECTs值中的所有值连接在一个大字符串V_RESULT中,类型为VARCHAR2(32767).之后,我使用MD5得到这个大字符串的哈希值(S_HASH_RESULT).它工作正常约8个月,但几天前我有ORA-06502(毫不奇怪).这意味着,我的最后一个大字符串有超过32K符号(我们使用1字节字符集--CL8MSWIN1251).
朋友们,我怎样才能重写我的函数,将BLOB数据类型用于V_RESULT变量,而不是VARCHAR2(32767).
下面是我的功能文字:
FUNCTION CALC_HASH (P_PARTAB_ID IN NUMBER, P_DOC_ID IN NUMBER) RETURN VARCHAR2 IS S_HASH_RESULT VARCHAR2(1000); V_RESULT VARCHAR2(32767); CURSOR T1_CUT IS ... /*BIG COMPLAIN SELECT*/ ... T1 T1_CUT%ROWTYPE; TYPE VALUES_T IS TABLE OF VARCHAR2(32767); L_VALUES VALUES_T; BEGIN OPEN T1_CUT; FETCH T1_CUT INTO T1; WHILE T1_CUT%FOUND LOOP EXECUTE IMMEDIATE T1.TEXT BULK COLLECT INTO L_VALUES; FOR INDX IN 1 .. L_VALUES.COUNT LOOP V_RESULT := V_RESULT || '' ||TO_CHAR(L_VALUES (INDX)); END LOOP; FETCH T1_CUT INTO T1; END LOOP; CLOSE T1_CUT; S_HASH_RESULT := DBMS_OBFUSCATION_TOOLKIT.MD5(input_string=>V_RESULT); RETURN S_HASH_RESULT; END CALC_HASH;
提前致谢!
有一个函数叫做utl_raw.cast_to_raw(vc)
将函数转换varchar2
为BLOB
值.
但是,我建议使用CLOB
存储字符串值.BLOB
根本没有字符语义,即NLS_LANG
忽略设置.
编辑:
如果你想转换VARCHAR2
成CLOB
,只需使用TO_CLOB