Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

es wird oracle verwendet

ich hatte an pl sql oder so etwas gedacht?

was ist stored proc?

wie würde das vom prinzip aussehen?

- Tabelle import Zeilenweise lesen

- prüfen ob in Tabelle sap_subject_item der Eintrag vorhanden ist

- wenn ja: dann schreibe auf die Konsole oder in eine Tabelle oder sonst was

- wenn nicht: Datensatz in Tabelle sap_subject_item einfügen

Am Ende muss irgendwo noch ein Commit gemacht werden.

Frank

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?

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;

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

ich weiß nicht ob es dem TE noch nützt, aber spool kann auch im append modus benutzt werden..

du könntest also immer wenn du die fehlenden sätze ausgibst eine weitere Zeile in deine spool schreiben, und am Ende hättest du eine Datei mit den Sätzen.

oder inwiefern geht es nicht bei dir?

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.