19. oktober 2001 - 06:58Der er
10 kommentarer og 2 løsninger
Indlæsning fra fil
Jeg har en fil, hvis datainhold skal overføres til en tabel på en Oracle 8.0.6.1. Inden data sættes ind i tabellen skal de linie for linie i filen formateres.
Er der nogen som har et eksempel på hvorledes dette gøres? Er det dbms_lob.open, dbms_lob.read, og dbms_lob.close man skal anvende?
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
Prøv med utl_file.fopen, utl_file.get_line og utl_file.close:
DECLARE buf VARCHAR2(2000); my_file utl_file.file_type; BEGIN my_file:=utl_file.fopen(\'my_catalogue\', \'my_file_name\', \'R\'); BEGIN; LOOP utl_file.get_line(buf); -- formater linien fra filen (i buf) og indsæt den i tabellen END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; utl_file.fclose(my_file);
Husk at utl_file_dir (som sættes i init.ora) skal inkludere det katalog, du læser fra.
Det script som skal overføre data fra filen til tabellen skal lægge i Oracle jobscheduler (dbms_job) og dermed køre udelukkende på serveren, dvs. filen, som jeg henter data fra, er placeret på serveren. Er det ikke muligt at anvende dbms_lob pakken eller kan det lade sig gøre med utl_file?
Som jeg forstår din problemstilling kan du bruge utl_file. Du kan i hvert fald godt skrive en procedure som anvender utl_file og som startes fra dbms_job.
Hvis du kender længden på den enkelte linie (f.eks. fordi filen er i fast format) kan du læse en linie med dbms_lob.read eller dbms_lob.substr. Der er eksempler i Supplied PL/SQL Packages Reference.
Medmindre vi taler om rigtig mange linier, dvs. mange 100.000 - eller måske millioner - af linier bør utl_file ikke have problemer.
=> Mundt, hvilken type bearbejdning er det der skal til før data indsættes. Strenge der skal afkortes, konvertering til number eller hvad? Hvis det er opslag i databasen, så er det i hvert fald ikke Loader der skal bruges.
Det jeg gør er at jeg aflæser et nummer (en linie af gangen) og hvis nummeret indeholdet *\'ner ændrer jeg nummeret inden jeg sætter det ind i tabellen. Hvis der ikke er *\'ner i nummeret sættes det direkte ind i tabellen.
Er det ikke lettere at konvertere alle *\'ner i filen før indlæsning, nå men ellers kan TRANSLATE(streng, \'*\',\'0\') bruges. Så har du en simpel formattering som Loader godt kan klare. Se \"Combinations of Operators\" i \"5 SQL*Loader Control File Reference\"
10 mill rækker, helt sikkert, men det kommer an på hvor lang tid det tager at lave controlfilen. Det plejer at tage mindst lige så lang tid som loaden, hvis man ikke helt har styr på opbygningen. Men start med at suge et eksempel fra metalink/technet, så går det nok.
Det viste sig at dbms_lob var det bedste at anvende i mit tilfælde. Tak for hjælpen.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.