【问题标题】:How to convert VARCHAR2 to BLOB inside Oracle 11g PL/SQL after ORA-06502ORA-06502 之后如何在 Oracle 11g PL/SQL 中将 VARCHAR2 转换为 BLOB
【发布时间】:2014-08-24 06:29:54
【问题描述】:

我有一个函数,计算大字符串的哈希值!首先我写了一个游标 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;

提前致谢!

【问题讨论】:

    标签: plsql oracle11g blob plsqldeveloper


    【解决方案1】:

    有一个名为utl_raw.cast_to_raw(vc) 的函数将varchar2 转换为BLOB 值。

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

    编辑:

    如果要将VARCHAR2 转换为CLOB,只需使用TO_CLOB

    【讨论】:

    • 可能是某些表中的照片列,所以,我认为 BLOB 是更好的选择..
    • 作品,ty。你知道如何将 blob 转换为 varchar2 吗?
    • 试试这个:select utl_raw.cast_to_varchar2(dbms_lob.substr(BLOB_FIELD)) from TABLE_WITH_BLOB where ID = '';
    猜你喜欢
    • 2012-10-03
    • 2015-12-13
    • 2017-01-17
    • 2013-11-07
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2014-12-30
    相关资源
    最近更新 更多