Plsql ORA-06502之后如何在Oracle 11g PL/SQL内部将VARCHAR2转换为BLOB

Plsql ORA-06502之后如何在Oracle 11g PL/SQL内部将VARCHAR2转换为BLOB,plsql,oracle11g,blob,plsqldeveloper,Plsql,Oracle11g,Blob,Plsqldeveloper,我有一个函数,它计算大字符串的哈希值!首先,我编写了一个游标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 i

我有一个函数,它计算大字符串的哈希值!首先,我编写了一个游标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_结果中包含所有值,类型为VARCHAR2(32767)。之后,我使用MD5获得这个大字符串的哈希值(S_hash_RESULT)。它在8个月左右工作正常,但几天前我得到了ORA-06502(毫不奇怪)。这意味着,我的最后一个大字符串有超过32K个符号(我们使用1字节字符集-CL8MSWIN1251)

朋友们,我如何将使用BLOB数据类型的函数重写为V_结果变量,而不是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\u raw.cast\u to\u raw(vc)
的函数,它将
varchar2
转换为
BLOB

但是,我建议使用
CLOB
来存储字符串值
BLOB
完全没有字符语义,即忽略
NLS_LANG
设置

编辑:


如果您想将
VARCHAR2
转换为
CLOB
,只需使用
to\u CLOB

就可以了,它可能是某些表中的照片列,因此,我认为BLOB是更好的选择..有效,ty。您知道如何将blob转换为varchar2吗?尝试以下操作:从ID为“”的表_中选择utl_raw.cast_to_varchar2(dbms_lob.substr(blob_字段));