Как преобразовать VARCHAR2 в большой двоичный объект внутри Oracle 11g PL / SQL после ORA-06502

#plsql #oracle11g #blob #plsqldeveloper

#plsql #оракул11g #большой двоичный объект #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 id=documentid
  

Каждая выборка может содержать одну или несколько строк. Итак, я объединяю ВСЕ значения в строках в каждом SELECT и ВСЕ значения SELECTs в одну большую строку V_RESULT с типом VARCHAR2(32767). После этого я получаю хэш-значение (S_HASH_RESULT) этой большой строки, используя MD5. Он отлично работает около 8 месяцев, но несколько дней назад у меня появился ORA-06502 (неудивительно). Это означает, что моя последняя большая строка содержит более 32 ТЫСЯЧ символов (мы используем набор символов размером 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) которая преобразует a varchar2 в BLOB значение.

Тем не менее, я рекомендую использовать CLOB для хранения строковых значений. BLOB не имеет символьной семантики вообще, т.е. NLS_LANG настройки игнорируются.

Редактировать:

если вы хотите преобразовать VARCHAR2 в CLOB , просто используйте TO_CLOB

Комментарии:

1. Вероятно, это будет столбец photo в какой-нибудь таблице (ах), так что, я думаю, BLOB — лучший вариант..

2. Работает, тай. Вы знаете, как преобразовать blob-объект в varchar2?

3. попробуйте это: выберите utl_raw.cast_to_varchar2(dbms_lob.substr(BLOB_FIELD)) из TABLE_WITH_BLOB, где ID = ‘<идентификатор строки>’;