Sans connaître vos besoins exacts, je ne peux faire que des commentaires généraux. Les BLOBS dans Oracle ne sont pas les types les plus rapides. Assurez-vous de ne pas générer de nombreux goulots d'étranglement au niveau de la performance et exécutez des tests de performance sur la fonctionnalité que vous construisez le plus rapidement possible pour vous assurer qu'elle répondra aux exigences.
dbms_lob est votre ami. En particulier, vous pouvez trouver utile la fonction read et substr (pour lire des parties du blob). Restez à l'écart des procédures de type C externes - elles sont susceptibles de ralentir considérablement. Les fonctions PL/SQL ont tendance à être beaucoup plus rapides. Je ne connais pas les procédures Java. Comme le moteur Java est plus intégré dans Oracle, il peut être très bon à utiliser. Il peut être utile de faire une première validation de principe pour comparer PL/SQL avec Java. Avec Java, vous pourrez lire les données sous la forme d'un octet [] et manipuler à votre guise en utilisant le monde Java. Les procédures externes pour Java sont faciles à faire - vous pouvez même simplement donner à Oracle le code source Java.
Pour PL/SQL, une technique que nous avons trouvé très utile est de convertir le blob à une brute, qui jeta à un varchar, puis le convertir en hexadécimal, puis manipuler l'hexagone (cordes) à la norme Fonctions de chaîne Oracle. I.e:
create or replace function retrieve_data_from_blob (
b blob
, tag_code
)
as
lw long raw;
data varchar(30000);
result varchar(100);
amount pls_integer := 30000;
begin
-- covert blob to long raw.
-- amount will hold total bytes read.
dbms_lob.read(b, amount, 1, lw);
data := util_raw.rawtohex(lw);
-- retrieve_embedded retrieves data tagged with tag_code
-- from internal binary structure by reading hex data
return retrieve_embedded(data, tag_code);
end;
/
Cela fonctionnerait pour des blobs d'une taille allant jusqu'à 15Kb. La fonction retrieve_embedded peut, par exemple, être capable de lire le premier « octet » en faisant une substr(data, 1, 8)
, la conversion à une décimale que par to_number(hexdata, 'xxxxxxxx')
l'utiliser comme un offset ... etc.