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

 大狗nonodq_284 发布于 2023-01-06 15:35

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

提前致谢!

1 个回答
  • 有一个函数叫做utl_raw.cast_to_raw(vc)将函数转换varchar2BLOB值.

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

    编辑:

    如果你想转换VARCHAR2CLOB,只需使用TO_CLOB

    2023-01-06 15:36 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有