You are not logged in.

  • Login

1

Tuesday, July 3rd 2007, 9:53am

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

2

Tuesday, July 3rd 2007, 2:45pm

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.

SQL Code

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

http://orafaq.com/faq/can_one_read_write_files_from_pl_sql

3

Tuesday, July 3rd 2007, 3:22pm

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

SQL Code

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


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)
krug-systems.de has attached the following file:
  • supplier.dat (785 Byte - 121 times downloaded - latest: May 18th 2012, 7:52am)

4

Tuesday, July 3rd 2007, 5:02pm

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.

Quoted

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

5

Tuesday, July 3rd 2007, 5:10pm

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 :)

6

Wednesday, July 4th 2007, 9:09am

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

7

Wednesday, July 4th 2007, 1:55pm

/supplier ist relativ vom Linux Root Verzeichnis. Ist das so gedacht?
Groß- und Kleinschreibung mal in einer Shell überprüft?

8

Wednesday, July 4th 2007, 2:16pm

ok war mein fehler, .... :!:
war aber bestimmte nicht meine letzte wortmeldung :)

9

Wednesday, July 4th 2007, 3:05pm

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?

Source code

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

10

Wednesday, July 4th 2007, 5:42pm

hihi, alles mal aktiviert.
ich denke aber es sollte dbms_output.enable(1000000); sein.

11

Thursday, July 5th 2007, 9:27am

danke für deine aufmerksamkeit und deine hilfsbereitschaft, es funktioniert habe n Feld in der DB zu klein definiert ;(

Social bookmarks