it-ecki Geschrieben 7. Januar 2011 Teilen Geschrieben 7. Januar 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 7. Januar 2011 Teilen Geschrieben 7. Januar 2011 Hallo, das ist mit reinem SQL nicht oder nur schwer zu lösen. Hängt vom verwendeten DBMS ab. Welches wird übrigens benutzt? Ich würde das über eine Stored Proc lösen. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
it-ecki Geschrieben 7. Januar 2011 Autor Teilen Geschrieben 7. Januar 2011 es wird oracle verwendet ich hatte an pl sql oder so etwas gedacht? was ist stored proc? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 7. Januar 2011 Teilen Geschrieben 7. Januar 2011 PL-SQL != SQL Stored Procedures gibt es in Oracle und diesen werden mit PL-SQL geschrieben. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
it-ecki Geschrieben 7. Januar 2011 Autor Teilen Geschrieben 7. Januar 2011 wie würde das vom prinzip aussehen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 7. Januar 2011 Teilen Geschrieben 7. Januar 2011 - 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
it-ecki Geschrieben 10. Januar 2011 Autor Teilen Geschrieben 10. Januar 2011 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 10. Januar 2011 Teilen Geschrieben 10. Januar 2011 wie kann ich einen Import bspw. aus einer CSV Datei in eine Tabelle durchführen? Indem Du in einer Sprache deiner Wahl ein Importprogramm schreibst oder es gibt z. B. den SQL Loader. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
it-ecki Geschrieben 13. Januar 2011 Autor Teilen Geschrieben 13. Januar 2011 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; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 13. Januar 2011 Teilen Geschrieben 13. Januar 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Corto -sX- Geschrieben 14. Januar 2011 Teilen Geschrieben 14. Januar 2011 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.