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!
Probabilmente, sarà colonna foto in qualche tavolo (s), così, penso BLOB è l'opzione migliore .. – Sergey
Funziona, ty. Sai come convertire blob in varchar2? – cheloncio
provare questo: selezionare utl_raw.cast_to_varchar2 (dbms_lob.substr (BLOB_FIELD)) da TABLE_WITH_BLOB dove ID = ''; –