Il blog di Giuseppe Marchi - SharePoint MVP
NAVIGATION - SEARCH

Caricare un file all'interno di un campo BLOB in Oracle

Oracle, essendo un database ad oggetti multimediali, ci permette di salvare all'interno di una tabella un intero file. File che può essere letto e modificato.
Questo tipo di possibilità è data dai tipi di dati LOB (Large OBject) come CLOB, BFILE e BLOB. Il primo permette di archiviare stringhe di caratteri nolto lunghe, il secondo permette di salvare tipi di file binari, mentre il testo (decisamente più interessante) permette allo sviluppatore di inserire qualsiasi tipo di file, dal file di testo alle immagini.
Vediamo ora come dichiarare una tabella con una colonna di tipo blob e come creare una procedura che effettui il caricamento vero e proprio del file sulla base di dati dal file system.

Creazione della tabella:

CREATE TABLE provaBlob (

fileName VARCHAR2(15),
file BLOB);

Creazione di un oggetto "Directory", che rappresenta il ponte tra il database e la directory fisica:

CREATE OR REPLACE DIRECTORY myDirectory AS 'C:\MyFiles';

Creazione della procedura d'inserimento:

CREATE OR REPLACE PROCEDURE loadFiles(nomeFile IN VARCHAR2) IS

bl BLOB;
bf BFILE;
bs INTEGER;
BEGIN
INSERT INTO provaBlob VALUES(nomefile, empty_blob());
bf := bfilename('myDirectory', nomeFile);
DBMS_LOB.FILEOPEN(bf);
bs := DBMS_LOB.GETLENGTH(bf);
SELECT file INTO bl FROM provaBlob WHERE fileName = nomefile;
DBMS_LOB.LOADFROMFILE(bl, bf, bs);
DBMS_LOB.FILECLOSE(bf);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||' '||SQLERRM);
END;
/
SHOW ERRORS

Una volta creati tutti questi oggetti (che chiaramente devono essere creati da un utente con permessi di creazione di tabelle, procedure e directory), possiamo andare a caricare il nostro primo file, eseguendo la procedura appena creata:

EXEC loadFiles('prova.xml');

A breve cercherò di pubblicare il modo di leggere o caricare un file dal file system con .NET e l'uso della libreria Oracle Data Provider for .NET, una libreria di classi .NET fornita da Oracle per far interagire il "bestione" con il applicazioni .NET.
blog comments powered by Disqus