Si të listohen fajllat në një direktorium direkt nga Oracle Databaza?
Siq e thash në postimin e kaluar në skenaret të cilët involvojnë futjen e të dhanave nëpërmjet një numri të madh të tekst fajllave strategjia e futjes së tyre nëpërmjet External Tables të Oracle është më e lehta.
Mirëpo, kur shkruajmë PL/SQL kod për t'i përpunuar ato fajlla na duhet të dijmë se cilët janë ata fajlla që duhet të futen në databazë. Fatkeqësisht PL/SQL paketa UTL_FILE
e cila vjen e parainstaluar në Oracle Databazë nuk e ofron këtë mundësi.
Pra shikuar nga perspektiva e databazës ne nuk dijmë se çka përmban një direktorium i caktuar sepse nuk ekziston funksioni LIST_FILES
.
Për t'a evituar këtë problem na duhet njëfare reference e cila do të ishte e qasshme nga databaza dhe e cila do të përmbante informatat e nevojshme për listën e fajllave në direktoriumin prej të cilit po mendojmë që t'i fusim në databazë.
Kjo referencë më së miri do të ishte një tabelë me emrat e fajllave. Realisht edhe kjo tabelë duhet të jetë një External Table e cila do të bazohej në një tekst fajll që përmban emrat e fajllave. Natyrisht se ky tekst fajll do të duhej të popullohej me të dhana disi.
Për këtë punë në ndihmë na vjen Sistemi Operativ, për shembull nëse Oracle Databaza është e instaluar në ndonjë *NIX sistem atëherë një shell skripte e vogël mund të përdoret për ta arritur këtë qëllim. Skripta në fjalë mund të duket kështu, pra për cdo fajll i cili mbaron me .CSV
printoje:
for file in /path/to/files/to/import/*.csv
do
echo "$file"
done
Kjo skriptë e thjeshtë mund të ruhet në një fajll list_files.sh
dhe pastaj mund të bëhet schedule me cron
që të ekzekutohet çdo minutë psh:
1 * * * * /path/to/file_list.sh > /path/to/external/table/fl_source.txt
Në këtë mënyrë kjo skriptë ekzekutohet çdo minutë dhe përmes shprehjes >
shkruan gjithçka që printon në fajllin (të cilin poashtu e rikrijon) fl_source.txt
.
Nëse Oracle Databaza është e instaluar në Windows sistem atëhere PowerShell skripta do të dukej kështu
Get-ChildItem -Path F:\path\to\files\to\import\*.csv -Name
e cila pastaj bëhet schedule me Task Scheduler të Windows. Duhet me pasë parasysh se këto skripta janë shume të thjeshta dhe nuk e marrin parasysh situaën kur kemi overlapping në ekzekutim (sidomos në Linux), për t'a evituar këtë problem duhet me u shkru ni mekanizëm sinkronizimi me lock
fajlla psh.
Duke pasur fl_source.txt
tani mund të krijohet External Tabela:
CREATE TABLE FILE_LIST
(
FILE_NAME VARCHAR2(50)
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY DATA_PUMP_DIR
LOCATION
(
'file_list_source.txt'
)
);
Kjo tabelë azhurnohet çdo minut duke i falënderuar cron
-it ose Task Schedulerit, tash nëse dojmë me ditë se çka përmban direktoriumi prej të cilit dojmë me i importu fajllat në databazë mjafton vetëm një
SELECT file_name from FILE_LIST;
(natyrisht me 1 minutë vonesë).
Kjo mënyrë mund të duket primitive në fillim, mirëpo është mjaft efektive kur të dhanat importohen nga fajllat e thjeshtë.