Oracle: Einlesen von Dateien. Zeile für Zeile.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Oracle: Einlesen von Dateien. Zeile für Zeile.

    Guten Morgen,
    vielleicht kann mir jemand von euch helfen. Ich habe ein *.dat file, kann wie jedes *.txt file gelesen werden. dieses möchte ich in einenm PL/SQL Statment öffnen und Zeile für Zeile einlesen hat jemand von euch ein Beispiel oder ne Doku wo ich nachsehen kann?

    Bsp:
    Z1 => 0123456789
    Z2 => 9876543210
    dann soll
    a = Zeichen( 0-2 ) // 012
    b = Zeichen( 3-4 ) // 34
    c = Zeichen( 5-8 ) // 5678
    d = Zeichen( 9 ) // 9
    insert in db
    a = Zeichen( 0-2 ) // 987
    b = Zeichen( 3-4 ) // 65
    c = Zeichen( 5-8 ) // 4321
    d = Zeichen( 9 ) // 0
    insert in db
    sein.

    hab es mit dem LOAD DATA - Befehl versucht bin aber nicht zum Erfolg gekommen.

    wäre super wenn mir jemand helfen könnte, Danke
    MFG Andy
    Wer aufgehört hat besser zu werden, hat aufgehört gut zu sein!!!
  • Hi,
    Lesen/Schreiben von Dateien mit PL/SQL und Orcale mit UTL_FILE.
    In dem Fall gibts eben die VARCHAR Länge 255 Zeichen. Wie weit du TEXT ausreizen kannst, weiß ich nicht, Aber für dein Beispiel sollte es schon reichen.

    Quellcode

    1. DECLARE
    2. v_file_handler UTL_FILE.FILE_TYPE;
    3. v_line VARCHAR2(255);
    4. BEGIN
    5. v_file_handler := UTL_FILE.FOPEN('/ordner', 'datei.txt','r');
    6. BEGIN
    7. LOOP
    8. UTL_FILE.GET_LINE(v_file_handler, v_line);
    9. END LOOP;
    10. EXCEPTION
    11. WHEN NO_DATA_FOUND THEN
    12. EXIT;
    13. END;
    14. UTL_FILE.FCLOSE(v_file_handler);
    15. END;
    Alles anzeigen

    http://orafaq.com/faq/can_one_read_write_files_from_pl_sql
  • hi was mir noch nicht klar ist wie ich des dann mit Zeile für zeile einlese, deshalb hab ich dir mal meinen code reingestellt und zudem mal 2 datensätze meines *.dat

    Quellcode

    1. DECLARE
    2. a varchar2(10); --Lieferantennummer
    3. b varchar2(3); --Länderschlüssel
    4. c varchar2(35); --Lieferanten_Name
    5. d varchar2(35); --Lieferanten_Ort
    6. e varchar2(10); --Lieferanten_PLZ
    7. v_file_handler UTL_FILE.FILE_TYPE;
    8. v_line VARCHAR2(255);
    9. BEGIN
    10. v_file_handler := UTL_FILE.FOPEN('/supplier', 'P99-LIEFERER.DAT','r');
    11. BEGIN
    12. LOOP
    13. UTL_FILE.GET_LINE(v_file_handler, v_line);
    14. a :=SUBSTR(v_line,64,10);
    15. b :=SUBSTR(v_line,60,3);
    16. c :=SUBSTR(v_line,95,35);
    17. d :=SUBSTR(v_line,178,35);
    18. e :=SUBSTR(v_line,223,10);
    19. insert INTO bom.tabsupplier (NID,VCSUPPLIERNUMBER,VCCOUNTRY,VCNAME,VCLOCATION,VCPLZ) VALUES
    20. (
    21. (select max(nid)+1 from tabsupplier),
    22. a,
    23. b,
    24. c,
    25. d,
    26. e
    27. );
    28. commit;
    29. END LOOP;
    30. EXCEPTION
    31. WHEN NO_DATA_FOUND THEN
    32. EXIT;
    33. END;
    34. UTL_FILE.FCLOSE(v_file_handler);
    35. END;
    Alles anzeigen


    also dieses file möchte ich in diese Tabelle bekommen:

    Spaltenname Null? Typ
    ------------------------------ -------- ----
    NID NOT NULL FLOAT(0)
    VCSUPPLIERNUMBER NOT NULL VARCHAR2(20)
    VCCOUNTRY NOT NULL VARCHAR2(2)
    VCNAME NOT NULL VARCHAR2(100)
    VCLOCATION VARCHAR2(100)
    VCPLZ VARCHAR2(10)
    Dateien
    • supplier.dat

      (785 Byte, 730 mal heruntergeladen, zuletzt: )
    MFG Andy
    Wer aufgehört hat besser zu werden, hat aufgehört gut zu sein!!!
  • Habe selbst keine Oracle DB zum testen. Wo ist denn noch der Fehler?
    Vielleicht ein Problem mit den nicht UNIX Zeilenumbrüchen...

    Was mich nur wundert, wie du dir das mit den hartgecodeten Werten für SUBSTR gedacht hast.

    Ich denke hier musst du noch mit INSTR und Trennzeichen arbeiten.

    Falls du irgendwelche Exceptions bekommst, erweitere dein Exception Handling.
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    UTL_FILE.FCLOSE(rrs_ptr);
    WHEN VALUE_ERROR THEN
    DBMS_OUTPUT.PUT_LINE('VALUE ERROR');
    RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    WHEN UTL_FILE.INVALID_PATH THEN
    DBMS_OUTPUT.PUT_LINE('INVALID PATH');
    RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    WHEN UTL_FILE.INVALID_MODE THEN
    DBMS_OUTPUT.PUT_LINE('INVALID_MODE');
    RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    WHEN UTL_FILE.INVALID_FILEHANDLE THEN
    DBMS_OUTPUT.PUT_LINE('INVALID_FILEHANDLE');
    RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    WHEN UTL_FILE.INVALID_OPERATION THEN
    DBMS_OUTPUT.PUT_LINE('INVALID_OPERATION');
    RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    WHEN UTL_FILE.READ_ERROR THEN
    DBMS_OUTPUT.PUT_LINE('READ_ERROR');
    RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    WHEN UTL_FILE.WRITE_ERROR THEN
    DBMS_OUTPUT.PUT_LINE('WRITE_ERROR');
    RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    WHEN UTL_FILE.INTERNAL_ERROR THEN
    DBMS_OUTPUT.PUT_LINE('INTERNAL_ERROR');
    RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('UN-HANDLED');
    RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');

    http://oracle.ittoolbox.com/groups/technical-functional/oracle-dev-l/utl_file-importing-flat-file-into-table-1419146
  • Hallo, das kannst du auch einfacher machen, Stichwort Oracle-Client, oder Oracle-Database Manager, damit kannst eigentlich alles machen :) Wenn du das machst obacht mit den Instanzen, die Tools verhspeln sich da mal ganz gerne :)
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert, der letzte Netzknoten kommerzialisiert, die letzte Newsgroup moderiert wird, werdet Ihr merken, dass man mit Geld allein nicht programmieren kann.
  • morgen, ist hardcodiert da es feste String vorgaben sind, müsste doch dann so fuktionieren, ODER?

    ich bekomme immer:
    ORA-29283: Ungültiger Dateivorgang
    ORA-06512: in "SYS.UTL_FILE", Zeile 475
    ORA-29283: Ungültiger Dateivorgang
    ORA-06512: in Zeile 10
    MFG Andy
    Wer aufgehört hat besser zu werden, hat aufgehört gut zu sein!!!
  • schau und da bin ich wieder :cry:
    mal wieder mit einer anderen Fehlermeldeung, ....
    hast du n Tipp wie ich schnell und effizient zu meinem Fehler komme?

    Quellcode

    1. SQLWKS> set serveroutput on
    2. Server Output ON
    3. SQLWKS> set echo on
    4. Echo ON
    5. SQLWKS> set timing on
    6. Timing ON
    7. SQLWKS>
    8. SQLWKS> DECLARE
    9. 2> a varchar2(10); --Lieferantennummer
    10. 3> b varchar2(3); --Länderschlüssel
    11. 4> c varchar2(35); --Lieferanten_Name
    12. 5> d varchar2(35); --Lieferanten_Ort
    13. 6> e varchar2(10); --Lieferanten_PLZ
    14. 7> v_file_handler UTL_FILE.FILE_TYPE;
    15. 8> v_line VARCHAR2(255);
    16. 9> BEGIN
    17. 10> v_file_handler := UTL_FILE.FOPEN('XMLDIR', 'supplier.dat','r');
    18. 11>
    19. 12> BEGIN
    20. 13> loop
    21. 14> UTL_FILE.GET_LINE(v_file_handler, v_line);
    22. 15> a :=SUBSTR(v_line,65,10);
    23. 16> b :=SUBSTR(v_line,61,3);
    24. 17> c :=SUBSTR(v_line,96,35);
    25. 18> d :=SUBSTR(v_line,173,35);
    26. 19> e :=SUBSTR(v_line,218,10);
    27. 20> dbms_output.put_line(a);
    28. 21> dbms_output.put_line(b);
    29. 22> dbms_output.put_line(c);
    30. 23> dbms_output.put_line(d);
    31. 24> dbms_output.put_line(e);
    32. 25> insert INTO bom.tabsupplier (NID,VCSUPPLIERNUMBER,VCCOUNTRY,VCNAME,VCLOCATION,VCPLZ) VALUES
    33. 26> (
    34. 27> (select max(nid)+1 from tabsupplier),
    35. 28> a,
    36. 29> b,
    37. 30> c,
    38. 31> d,
    39. 32> e
    40. 33> );
    41. 34> --commit;
    42. 35>
    43. 36> END LOOP;
    44. 37> EXCEPTION
    45. 38> WHEN NO_DATA_FOUND THEN dbms_output.put_line('Keine Daten gefunden');
    46. 39> WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('VALUE ERROR');
    47. 40> RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    48. 41> WHEN UTL_FILE.INVALID_PATH THEN DBMS_OUTPUT.PUT_LINE('INVALID PATH');
    49. 42> RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    50. 43> WHEN UTL_FILE.INVALID_MODE THEN DBMS_OUTPUT.PUT_LINE('INVALID_MODE');
    51. 44> RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    52. 45> WHEN UTL_FILE.INVALID_FILEHANDLE THEN DBMS_OUTPUT.PUT_LINE('INVALID_FILEHANDLE');
    53. 46> RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    54. 47> WHEN UTL_FILE.INVALID_OPERATION THEN DBMS_OUTPUT.PUT_LINE('INVALID_OPERATION');
    55. 48> RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    56. 49> WHEN UTL_FILE.READ_ERROR THEN DBMS_OUTPUT.PUT_LINE('READ_ERROR');
    57. 50> RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    58. 51> WHEN UTL_FILE.WRITE_ERROR THEN DBMS_OUTPUT.PUT_LINE('WRITE_ERROR');
    59. 52> RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    60. 53> WHEN UTL_FILE.INTERNAL_ERROR THEN DBMS_OUTPUT.PUT_LINE('INTERNAL_ERROR');
    61. 54> RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    62. 55> WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('UN-HANDLED');
    63. 56> RAISE_APPLICATION_ERROR(-20100,'FILE ERROR');
    64. 57>
    65. 58> END;
    66. 59>
    67. 60> UTL_FILE.FCLOSE(v_file_handler);
    68. 61> END;
    69. 62>
    70. 63>
    71. ORA-20100: FILE ERROR
    72. ORA-06512: in Zeile 40
    73. VALUE ERROR
    Alles anzeigen
    MFG Andy
    Wer aufgehört hat besser zu werden, hat aufgehört gut zu sein!!!