View Full Version : PLSQL caricare file BLOB da una cartella
sampeiroma
14-03-2014, 08:36
Ciao,
come dice il titolo devo caricare dei file presenti in una cartella in una tabella Oracle11.
Per ora sono riuscito a caricare 1 file alla volta passando alla procedura la variabile "nomefile", in realtà dovrei leggere direttamente tutti i file presenti nel percorso indicato e scriverli nel DB.
Potete aiutarmi?
Grazie
Ciao
Puoi caricare i nomi dei file su una tabella ed aprire un ciclo su questi.
Fammi sapere.
:)
sampeiroma
20-03-2014, 16:37
Intanto grazie per la risposta, ci avevo pensato anch'io ma come li carico in tabella puoi aiutarmi? :mc:
Come prima cosa crei una directory logica su oracle che punti alla directory fisica (mi raccomando le grant di scrittura e lettura se operi con un'utenza diversa da system).
Successivamente crei una tabella esterna con un unico campo che in input prende un file su cui, precedentemente, hai mandato l'output di un ls (esempio fatto su unix, ma va bene anche per windows con le dovute differenze).
Fammi sapere se ti è chiaro. :)
Per esempio....
CREATE DIRECTORY TUADIR AS '/file_location';
CREATE TABLE nomefiletable
(
FIELD1 varchar2(100)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY TUADIR
ACCESS PARAMETERS
( RECORDS DELIMITED BY NEWLINE
LOGFILE 'ls.log'
FIELDS TERMINATED BY ';'
)
LOCATION (TUADIR:'ls.txt')
)
REJECT LIMIT 0
NOPARALLEL
NOMONITORING;
sampeiroma
21-03-2014, 14:00
dimenticavo.... non ho i diritti per creare cartelle su Oracle.:D
Vabbè, ma mica devi creare cartelle :mbe:
Quello che a te serve è una directory logica che punti al path fisico dove si trovano i file e una tabella che si agganci appunto alla directory logica.
Se sei riuscito a caricare un file vuol dire che hai già un puntamento al path fisico, e, immagino sia avvenuto per mezzo di una directory logica sul database, o no ?! :confused:
sampeiroma
24-03-2014, 08:10
Vabbè, ma mica devi creare cartelle :mbe:
Quello che a te serve è una directory logica che punti al path fisico dove si trovano i file e una tabella che si agganci appunto alla directory logica.
Se sei riuscito a caricare un file vuol dire che hai già un puntamento al path fisico, e, immagino sia avvenuto per mezzo di una directory logica sul database, o no ?! :confused:
ciao,
ho impostato un percorso all'interno della procedura, il comando create directory non posso utilizzarlo. attualmente la procedura è questa:
CREATE OR REPLACE PROCEDURE db.caricaFiles(nomefile IN VARCHAR2) IS
bl BLOB;
bf BFILE;
bs INTEGER;
BEGIN
INSERT INTO provaBlob VALUES(nomefile, empty_blob());
bf := bfilename('\\.......\TEST', nomeFile);
DBMS_LOB.FILEOPEN(bf);
bs := DBMS_LOB.GETLENGTH(bf);
SELECT fileB 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);
COMMIT;
END;
/
Se hai accesso al path fisico del server, fatti un ls ridirezionato su un file, o anche in memoria, crea una tabella e fai una insert a tappeto della lista di file generati. Poi su questa apri un ciclo.
Altri metodi non mi vengono in mente, ci sarebbe qualche package di sistema che consente di interagire con il sistema operativo, ma se non hai le grant per creare una directory esterna dubito tu abbia l'utenza di sys per eseguirli visto che non sono pubblici....
Altro non mi viene in mente :boh:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.