Avatar billede mundt Nybegynder
19. oktober 2001 - 06:58 Der 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?
Avatar billede holdam Nybegynder
19. oktober 2001 - 09:39 #1
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.
Avatar billede mundt Nybegynder
19. oktober 2001 - 10:11 #2
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?
Avatar billede teepee Nybegynder
19. oktober 2001 - 10:11 #3
Hvis de er rigtigt mange linier, efter samme format, så brug da SQL*Loader
Avatar billede mundt Nybegynder
19. oktober 2001 - 10:12 #4
Problemet er at data skal bearbejdes inden de overføres til tabellen.
Avatar billede holdam Nybegynder
19. oktober 2001 - 10:26 #5
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.
Avatar billede teepee Nybegynder
19. oktober 2001 - 10:39 #6
=> 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.
Avatar billede mundt Nybegynder
19. oktober 2001 - 10:43 #7
Det er ikke opslag men nogle numre i nogle linier som skal ændres.

      Tekstfil          Tabel

F.eks 9745412******* -> 97454120000000
Eller en ren overførsel

      97450000124000    97450000124000

I alt er der tale om ca. 10 millioner linier/rækker.
Avatar billede mundt Nybegynder
19. oktober 2001 - 10:54 #8
Jeg udtrykte mig vist ikke særlig klart.

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.
Avatar billede teepee Nybegynder
19. oktober 2001 - 11:03 #9
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\"
Avatar billede mundt Nybegynder
19. oktober 2001 - 11:11 #10
Lige et hurtigt spørgsmål inden jeg læser dokumentationen igennem du (teepee) refererer til:

Vil SQL*Loader kunne foretage denne rutine hurtigere, end hvis jeg anvender dbms_lob?
Avatar billede teepee Nybegynder
19. oktober 2001 - 12:07 #11
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.
Avatar billede mundt Nybegynder
23. oktober 2001 - 15:46 #12
Det viste sig at dbms_lob var det bedste at anvende i mit tilfælde. Tak for hjælpen.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester