web-dev-qa-db-ja.com

ORA-06502以降、Oracle 11g PL / SQL内でVARCHAR2をBLOBに変換する方法

大きな文字列のハッシュ値を計算する関数があります!まず、カーソル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には、1つ以上の行を含めることができます。したがって、各SELECTの行のALL値と、タイプVARCHAR2(32767)の1つの大きな文字列V_RESULTのALLSELECT値を連結します。その後、MD5を使用してこの大きな文字列のハッシュ値(S_HASH_RESULT)を取得します。約8か月で問題なく動作しますが、数日前にORA-06502を入手しました(当然のことです)。これは、私の最終的な大きな文字列に32Kを超えるシンボルがあることを意味します(1バイトの文字セット--CL8MSWIN1251を使用します)。

友だち、BLOBデータ型を使用する関数をVARCHAR2(32767)ではなくV_RESULT変数に書き換えるにはどうすればよいですか。

以下、私の関数のテキスト:

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;

前もって感謝します!

7
Sergey

_varchar2_をBLOB値に変換するutl_raw.cast_to_raw(vc)という関数があります。

ただし、文字列値を格納するにはCLOBを使用することをお勧めします。 BLOBには文字セマンティクスがまったくありません。つまり、_NLS_LANG_設定は無視されます。

編集:

_VARCHAR2_をCLOBに変換する場合は、単に_TO_CLOB_を使用します。

20
paubo147