我有一个函数,可以计算大字符串的哈希值!首先,我编写了一个游标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中的行中的所有值与一个大字符串V_RESULT中的所有SELECT值并置为VARCHAR2(32767)。之后,我使用MD5获得此大字符串的哈希值(S_HASH_RESULT)。它可以正常工作约8个月,但几天前我收到了ORA-06502(不足为奇)。这意味着,我的最后一个大字符串包含超过32K个符号(我们使用1个字节的字符集-CL8MSWIN1251)。
friend ,我该如何将使用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
关于plsql - 在ORA-06502之后如何在Oracle 11g PL/SQL中将VARCHAR2转换为BLOB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24548507/