web-dev-qa-db-fra.com

Base de données Oracle: comment lire un BLOB?

Je travaille avec une base de données Oracle et j'aimerais lire le contenu d'un BLOB. Comment puis-je faire cela?

Lorsque je fais une simple instruction select, elle renvoie simplement "(BLOB)" (sans les guillemets). Comment lire le contenu réel?

12
ktm5124

Vous pouvez vider la valeur en hexadécimal en utilisant UTL_RAW.CAST_TO_RAW(UTL_RAW.CAST_TO_VARCHAR2()).

SELECT b FROM foo;
-- (BLOB)

SELECT UTL_RAW.CAST_TO_RAW(UTL_RAW.CAST_TO_VARCHAR2(b))
FROM foo;
-- 1F8B080087CDC1520003F348CDC9C9D75128CF2FCA49D1E30200D7BBCDFC0E000000

C'est pratique parce que c'est le même format que celui utilisé pour l'insertion dans les colonnes BLOB:

CREATE GLOBAL TEMPORARY TABLE foo (
    b BLOB);
INSERT INTO foo VALUES ('1f8b080087cdc1520003f348cdc9c9d75128cf2fca49d1e30200d7bbcdfc0e000000');

DESC foo;
-- Name Null Type 
-- ---- ---- ---- 
-- B        BLOB 

Cependant, à un certain point (2000 octets?), La chaîne hexadécimale correspondante dépasse la longueur de chaîne maximale d'Oracle. Si vous devez gérer ce cas, vous devrez combiner Comment puis-je obtenir le contenu textuel de BLOB dans Oracle SQL avec le documentation pour DMBS_LOB.SUBSTR pour une approche plus compliquée qui vous permettra de voir les sous-chaînes du BLOB.

9
andrewdotn

SQL Developer peut afficher le blob sous forme d'image (au moins, cela fonctionne pour les jpeg). Dans la vue Données, double-cliquez sur le champ BLOB pour obtenir l'icône "crayon". Cliquez sur le crayon pour obtenir une boîte de dialogue qui vous permettra de sélectionner une case à cocher "Afficher comme image".

7
bob coner

Si vous utilisez le fournisseur de données natif Oracle plutôt que le pilote Microsoft, vous pouvez accéder à tous les types de champs

Dim cn As New Oracle.DataAccess.Client.OracleConnection
Dim cm As New Oracle.DataAccess.Client.OracleCommand
Dim dr As Oracle.DataAccess.Client.OracleDataReader

La chaîne de connexion ne nécessite pas de valeur de fournisseur, vous utiliserez donc quelque chose comme:

"Data Source=myOracle;UserID=Me;Password=secret"

Ouvrez la connexion:

cn.ConnectionString = "Data Source=myOracle;UserID=Me;Password=secret"
cn.Open()

Attachez la commande et définissez l'instruction SQL

cm.Connection = cn
cm.CommandText = strCommand

Définissez la taille de récupération. J'utilise 4000 car c'est aussi gros qu'un varchar peut être

cm.InitialLONGFetchSize = 4000

Démarrez le lecteur et parcourez les enregistrements/colonnes

dr = cm.ExecuteReader

Do while dr.read()
    strMyLongString = dr(i)
Loop

Vous pouvez être plus précis avec la lecture, par exemple dr.GetOracleString (i) dr.GetOracleClob (i) etc. si vous identifiez d'abord le type de données dans la colonne. Si vous lisez un type de données LONG, alors la simple dr(i) ou dr.GetOracleString(i) fonctionne très bien. L'essentiel est de s'assurer que InitialLONGFetchSize est suffisamment grand pour le type de données. Notez également que le pilote natif ne prend pas en charge CommandBehavior.SequentialAccess Pour le lecteur de données, mais que vous n'en avez pas besoin et que le champ LONG ne doit même pas être le dernier champ de l'instruction select.

2
Dave Harper

Si le contenu n'est pas trop volumineux, vous pouvez également utiliser

SELECT CAST ( <blobfield> AS RAW( <maxFieldLength> ) ) FROM <table>;

ou

SELECT DUMP ( CAST ( <blobfield> AS RAW( <maxFieldLength> ) ) ) FROM <table>;

Cela vous montrera les valeurs HEX.

2
AchimHensel

Si vous souhaitez obtenir le texte en clair (partie du corps) à partir d'un BLOB, vous pouvez utiliser le package CTX_DOC .

Par exemple, le CTX_DOC.FILTER la procédure peut "générer soit un texte brut soit une version HTML d'un document". Soit conscient que CTX_DOC.FILTER nécessite un index sur la colonne BLOB. Si vous ne le souhaitez pas, vous pouvez utiliser le CTX_DOC.POLICY_FILTER à la place, qui ne nécessite pas d'index.

0
5ton3

Quel client utilisez-vous? .Net, Java, Ruby, SQLPLUS, SQL DEVELOPER? Où avez-vous écrit cette simple déclaration de sélection?

Et pourquoi voulez-vous lire le contenu du blob, un blob contient des données binaires afin que les données soient illisibles. Vous devez utiliser un clob au lieu d'un blob si vous souhaitez stocker du texte au lieu du contenu binaire.

Je vous suggère de télécharger SQL DEVELOPER: http://www.Oracle.com/technetwork/developer-tools/sql-developer/overview/index.html . Avec SQL DEVELOPER, vous pouvez voir le contenu.

0
TTT