2014-07-03 17 views
5

Ho una funzione che calcola il valore hash della stringa grande! Prima di tutto ho scritto un T1_CUT cursore, che può includere conteggio variabile di istruzioni SELECT, qualcosa di simile a:Come convertire VARCHAR2 in BLOB all'interno di Oracle 11g PL/SQL dopo ORA-06502

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 

Ogni SELECT può contenere una o più righe. Quindi, concatro TUTTI i valori in righe in ogni valore SELECT e ALL SELECTs in una stringa grande V_RESULT con tipo VARCHAR2 (32767). Dopo di che ottengo il valore hash (S_HASH_RESULT) di questa grande stringa usando MD5. Funziona bene circa 8 mesi, ma pochi giorni fa ho ORA-06502 (nessuna sorpresa). Significa che la mia ultima grande stringa ha più di 32.000 simboli (usiamo 1 byte set di caratteri - CL8MSWIN1251).

Amici, come posso riscrivere la mia funzione per l'utilizzo del tipo di dati BLOB sulla variabile V_RESULT, non VARCHAR2 (32767).

Di seguito, il testo della mia funzione:

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; 

Grazie in anticipo!

risposta

16

c'è una funzione denominata utl_raw.cast_to_raw(vc) che trasforma un valore varchar2 in un valore BLOB.

Tuttavia, si consiglia di utilizzare CLOB per memorizzare i valori di stringa. BLOB non ha affatto la semantica dei caratteri, cioè le impostazioni di NLS_LANG vengono ignorate.

EDIT:

se si desidera trasformare VARCHAR2-CLOB, è sufficiente utilizzare TO_CLOB

+1

Probabilmente, sarà colonna foto in qualche tavolo (s), così, penso BLOB è l'opzione migliore .. – Sergey

+0

Funziona, ty. Sai come convertire blob in varchar2? – cheloncio

+1

provare questo: selezionare utl_raw.cast_to_varchar2 (dbms_lob.substr (BLOB_FIELD)) da TABLE_WITH_BLOB dove ID = ''; –

Problemi correlati