2014-07-03 5 views
5

Ich habe eine Funktion, die Hash-Wert der großen Zeichenfolge berechnet! Zunächst einmal habe ich einen Cursor T1_CUT, die eine variable Anzahl der SELECT-Anweisungen enthalten kann, so etwas wie:Wie VARCHAR2 zu BLOB in Oracle 11g PL/SQL nach ORA-06502 konvertieren

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 

Jede SELECT eine oder mehrere Zeilen enthalten. Also, concat alle Werte in Zeilen in jedem SELECT und alle SELECTs Werte in einer großen Zeichenfolge V_RESULT mit dem Typ VARCHAR2 (32767). Danach bekomme ich den Hash-Wert (S_HASH_RESULT) dieser großen Zeichenfolge mit MD5. Es funktioniert gut über 8 Monate, aber vor ein paar Tagen habe ich ORA-06502 (keine Überraschung). Das bedeutet, dass meine letzte große Zeichenfolge mehr als 32K Symbole hat (wir verwenden einen 1 Byte Zeichensatz - CL8MSWIN1251).

Freunde, wie kann ich meine Funktion für die Verwendung von BLOB-Datentyp auf Variable V_RESULT, nicht VARCHAR2 (32767) umschreiben.

Unten Text meiner Funktion:

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; 

Vielen Dank im Voraus!

Antwort

16

Es gibt eine Funktion namens utl_raw.cast_to_raw(vc), die einen varchar2 in einen BLOB Wert umwandelt.

Ich empfehle jedoch, CLOB zu verwenden, um Zeichenfolgenwerte zu speichern. BLOB hat überhaupt keine Zeichensemantik, d.h. NLS_LANG Einstellungen werden ignoriert.

EDIT:

wenn Sie VARCHAR2-CLOB transformieren möchten, verwenden Sie einfach TO_CLOB

+1

Wahrscheinlich werde es Spalte sein Foto in irgendeiner Tabelle (n), so, denke ich BLOB bessere Option ist, .. – Sergey

+0

Werke, ty. Weißt du, wie man Blob in varchar2 umwandelt? – cheloncio

+1

versuche dies: wähle utl_raw.cast_to_varchar2 (dbms_lobstr (BLOB_FIELD)) aus TABLE_WITH_BLOB wo ID = ''; –