Zum Inhalt springen

SQL Problem


it-ecki

Empfohlene Beiträge

Hallo ich habe folgendes Problem:

ich habe zwei Tabellen sap_subject_item und import

ich möchte nun aus der tabelle import die Werte in die

Tabelle sap_subject_item hinzufügen aber nur wenn keine

der einzufügenden Zahlen bislang in der Tabelle sap_subject_item vorkommt

bedeutet also ich brauche ein Prüf-Mechanismus ob der

Eintrag T999 in sap_subject_item.subject vorkommt, wenn

nicht dann muss ich das gleiche mit der item_id übeprüfen.

Sobald auch nur einer der beiden Werte vorkommt soll

eine Fehlermeldung in eine Protokolldatei geschrieben werden.

ich bin leider noch neueinsteiger in Sachen SQL und benötige dringend Hilfe

Liebe Grüße und Vielen Dank im Voraus

it-ecki

Tabname: subject_item

subject item_id

t000 2

t111 5

t222 8

t333 12

t444 20

Tabname: import

subject item_id

t999 15

t111 23

t444 20

Nach dem hinzufügen sollte die Tabelle also so aussehen:

Tabname: sap_subject_item

subject item_id

t000 2

t111 5

t222 8

t333 12

t444 20

t999 15

Protokoll:

T111 23 mindestens einer der Werte ist bereits vorhanden

T444 20 mindestens einer der Werte ist bereits vorhanden

Link zu diesem Kommentar
Auf anderen Seiten teilen

wie kann ich einen Import bspw. aus einer CSV Datei in eine Tabelle durchführen?

bislang war das hier die Überlegung:

insert into sap_techem_map_subject_item

select subject, item_id from sap_techem_tmp

where subject not in (select subject from sap_techem_map_subject_item)

wie kann man ein Protokoll erstellen lassen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo :)

ich habe es soweit hinbekommen, dass bei einem Eintrag (Spalten: Subject und Item_id) der genauso in der Import Tabelle vorhanden ist, der Eintrag aus der subject_item Tabelle gelöscht wird.

sobald nur ein Eintrag also nur eine Spalte bereits vorhanden ist soll er einen Fehler ausspucken und sagen wo der Fehler liegt

und sobald noch kein Eintrag vorhanden ist sollen die Werte in die Tabelle subject_item gespeichert werden.

jetzt habe ich zum einen das Problem, dass ich die Output Lines nicht auf dem Bildschirm haben möchte, sondern in eine Logdatei geschriebenw erden soll, doch wie kann ich das realisieren? Mit Spool funktioniert es irgendwie nicht so richtig.

Des weiteren habe ich noch das Problem, dass ich einen Import von einer CSV Datei in die Temp (Import) Tabelle haben möchte. also zwei Werte in die Tabelle eintragen aus einer csv Datei mit Semikolon getrennt. wie kann ich das umsetzen?

hier mein bisheriges Script

set serveroutput on size unlimited;

--spool 'D:\protokoll.log'



declare


cursor delete_cursor is 

    select sa.sap_map_temp.subject, sa.sap_map_temp.item_id 

    from sa.sap_map_temp

      inner join sa.sap_map_subject_item 

      on (sa.sap_map_temp.item_id = sa.sap_map_subject_item.item_id

      and sa.sap_map_temp.subject = sa.sap_map_subject_item.subject);


cursor import_cursor is 

    select sa.sap_map_temp.subject, sa.sap_map_temp.item_id 

    from sa.sap_map_temp      

    where (

            sa.sap_map_temp.item_id not in 

              (select item_id from sa.sap_map_subject_item)

            and

            sa.sap_map_temp.subject not in 

              (select subject from sa.sap_map_subject_item)

              );


-- doppelte Subject Einträge    

cursor fehler_cursor_subject is 

    select sa.sap_map_temp.subject, sa.sap_map_temp.item_id 

    from sa.sap_map_temp      

    where (

			sa.sap_map_temp.subject in 

              (select subject from sa.sap_map_subject_item)

			and sa.sap_map_temp.item_id not in 

              (select item_id from sa.sap_map_subject_item)

              );


-- doppelte Item_ID Einträge    

cursor fehler_cursor_item is 

    select sa.sap_map_temp.subject, sa.sap_map_temp.item_id 

    from sa.sap_map_temp      

    where (

			sa.sap_map_temp.item_id in 

              (select item_id from sa.sap_map_subject_item)

      and sa.sap_map_temp.subject not in 

              (select subject from sa.sap_map_subject_item)

            );



  rec_imp import_cursor%ROWTYPE;

  feh_imp_item fehler_cursor_item%ROWTYPE;

  feh_imp_subject fehler_cursor_subject%ROWTYPE;

  del_imp delete_cursor%ROWTYPE;


begin


 dbms_output.put_line('Protokoll vom: '||TO_CHAR(sysdate,'DD.MM.YYYY hh:mi:ss PM'));


 open delete_cursor;

	loop 

		fetch delete_cursor into del_imp; 

		exit when delete_cursor%NOTFOUND;


		delete from sa.sap_map_subject_item where item_id =del_imp.item_id;

		delete from sa.sap_map_temp where item_id=del_imp.item_id; 			--löscht den Eintrag, nachdem es in das Protokoll geschrieben wurde


		dbms_output.put_line('deleted: '||del_imp.subject|| ' --- ' || del_imp.item_id );


 end loop;


close delete_cursor;


open fehler_cursor_subject;

	loop 

		fetch fehler_cursor_subject into feh_imp_subject; 

		exit when fehler_cursor_subject%NOTFOUND;                                 	--wird beendet sobald bei letzter Zeile angekommen

		delete from sa.sap_map_temp where item_id=feh_imp_subject.item_id;	--löscht den Eintrag, nachdem es in das Protokoll geschrieben wurde


		dbms_output.put_line('ERROR Subject: '||feh_imp_subject.subject|| ' --- ' || feh_imp_subject.item_id||'                               manuelle Kontrolle notig');


 end loop;

close fehler_cursor_subject;


open fehler_cursor_item;

	loop 

		fetch fehler_cursor_item into feh_imp_item; 

		exit when fehler_cursor_item%NOTFOUND;                                  	--wird beendet sobald bei letzter Zeile angekommen

		delete from sa.sap_map_temp 

      where item_id=feh_imp_item.item_id;	                                  		--löscht den Eintrag, nachdem es in das Protokoll geschrieben wurde


		dbms_output.put_line('ERROR Item   :  '||feh_imp_item.subject|| ' --- ' || feh_imp_item.item_id||'                               manuelle Kontrolle notig');


 end loop;

close fehler_cursor_item;


open import_cursor;

	loop 

		fetch import_cursor into rec_imp; 

		exit when import_cursor%NOTFOUND;                                       	--wird beendet sobald bei letzter Zeile angekommen


		insert into sa.sap_map_subject_item (item_id, subject) 

      values (rec_imp.item_id, rec_imp.subject);

		delete from sa.sap_map_temp 

      where item_id = rec_imp.item_id;                                      		--löscht den Eintrag, nachdem es in das Protokoll geschrieben wurde


		dbms_output.put_line('Inserted: '||rec_imp.subject|| ' --- ' || rec_imp.item_id);



 end loop;

close import_cursor;



end;

/


--spool off;


set serveroutput off;

Link zu diesem Kommentar
Auf anderen Seiten teilen

sobald nur ein Eintrag also nur eine Spalte bereits vorhanden ist soll er einen Fehler ausspucken und sagen wo der Fehler liegt

Das hilft nur Handarbeit. Das muss man schon selber programmieren. Denn woher soll der Computer wissen was Du willst.

und sobald noch kein Eintrag vorhanden ist sollen die Werte in die Tabelle subject_item gespeichert werden.

Wo ist das Problem?

jetzt habe ich zum einen das Problem, dass ich die Output Lines nicht auf dem Bildschirm haben möchte, sondern in eine Logdatei geschriebenw erden soll, doch wie kann ich das realisieren? Mit Spool funktioniert es irgendwie nicht so richtig.

Dann nutze nicht dbms_output sonder schreibe die Meldungen in eine Tabelle mit insert into ....

Des weiteren habe ich noch das Problem, dass ich einen Import von einer CSV Datei in die Temp (Import) Tabelle haben möchte. also zwei Werte in die Tabelle eintragen aus einer csv Datei mit Semikolon getrennt. wie kann ich das umsetzen?

Es gibt z. B. das Package utl_file.

UTL_FILE

Frank

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...