当前位置: 首页 > 知识库问答 >
问题:

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

卫子平
2023-03-14

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

倪子晋
2023-03-14

有一个名为UTL_RAW.CAST_TO_RAW(vc)函数,它将VARCHAR2转换为BLOB值。

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

编辑:

如果要将varchar2转换为clob,只需使用to_clob

 类似资料:
  • 我用clobs和VARCHAR2做了一点实验。问题是,我们在数据库表中有很多XML,我希望尽快下载XML。由于我需要使用C#DevArt组件,我尝试了各种方法,发现clobs(它们涉及每行到数据库的一次往返)比VARCHAR2慢得多。 现在有人知道为什么查询在所有情况下都不起作用了吗。或者有没有人建议如何编写一个查询来查找clob是否可以作为VARCHAR2检索?

  • 我甚至尝试过直接分配 得到同样的结果。 编辑

  • 我得到这样的错误:错误:ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小

  • 问题内容: 我有一个表,其中有一个名为的列。其数据类型为。 我想对这一栏进行总结。 总计=> 如何使用ANSI SQL或Oracle SQL执行此操作? 问题答案: 您可以使用来分隔小时,分钟和秒,然后将其向上,最后使用function将其转换为type。

  • 问题内容: 我正在做这个 它给了我这个 但是我想要这个 请帮忙。 问题答案: 首先将其转换为十进制, SQLFiddle演示

  • 我们有一个旧表,其中日期字段以多种格式存储在VARCHAR2中。现在我们计划: 1) 将这些数据存储在具有适当日期字段的视图中。 2) 还以单一一致的格式(如MM/DD/YYYY)存储这些内容。 这是为#1所做的:创建一个函数,以便它可以解析VARCHAR2并将其转换为不同格式的DATE,例如: 对于#2,我们仍然需要将上述两个日期转换为MM/DD/YYYY,其中一个已采用此格式,因此我们需要先转