Zum Inhalt springen

janosch1972

Mitglieder
  • Gesamte Inhalte

    6
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von janosch1972

  1. Guten Morgen Dim, habe die Prozedur auf meine Bedürfnisse angepasst und angelegt. Hat problemlos funktioniert. Sinnvoll wäre es, wenn man die erstellten Trigger in eine Textdatei schreibt, oder diese direkt ausführen lässt. Gibt es eine Möglichkeit, dass man eine Textdatei erstellt (zur Kontrolle) und eine Möglicheit, dass die Trigger aus der Prozedur automatisch angelegt werden? Das wäre das Tüpfelchen auf dem "i". Danke schon mal im voraus. Schöne Grüße, janosch
  2. Danke sehr Dim. Das schaut schon mal professionell aus. D.h. bei Ausführung der Prozedur wird allen abgefragten Tabellen der Trigger hinzugefügt. Werde es mal bei mir testen und Feedback geben. Schöne Grüße, janosch
  3. Wie generiert Ihr die Trigger? Würde mich schon an Deine Tipps halten, hänge aber momentan ein bisschen in der Luft :-( Habe die Bindvariablen eingebaut, bekommen trotzdem einen Fehler: Missing expression.
  4. Habe die Prozedur umgebaut. Das Ergebnis findet Ihr weiter unter. Bei der Ausführung und der Übergabe der Parameter erscheint folgende Fehlermeldung: FEHLER in Zeile 1: ORA-00933: SQL command not properly ended ORA-06512: at "VISMAN.LOGSACHDAT", line 31 ORA-06512: at line 1 Ich weiss wirklich nicht, wo er sich da aufhängt. Und nun die korrigierte Prozedur. Vielleicht kann ein oder anderer was optimieren. Wäre sehr dankbar. CREATE OR REPLACE PROCEDURE LogSachDat( p_CADID VARCHAR2 p_PKColumn VARCHAR2, p_TableName VARCHAR2), IS v_Value VARCHAR2(4000); v_DataType VARCHAR2(4000); v_ColumnValue VARCHAR2(4000); v_Column VARCHAR2(30); v_Statement VARCHAR2(4000); -- Cursor erstellen CURSOR c_Column IS SELECT column_name FROM all_tab_columns WHERE table_name = p_TableName ORDER BY column_id; BEGIN OPEN c_Column; LOOP FETCH c_Column INTO v_Column; v_Statement := 'SELECT '||v_Column||' FROM '||p_TableName||' WHERE '||p_PKColumn||' = '||p_CADID; EXECUTE IMMEDIATE v_Statement INTO v_Value; -- die abgefragten Werte zusammenfassen v_ColumnValue := v_ColumnValue||';'||v_Value; END LOOP; CLOSE c_Column; -- das erste Zeichen entfernen v_ColumnValue := LTRIM(v_ColumnValue,';'); -- die Werte einfügen INSERT INTO visman.visdat_Log(CADID,TableName,LogUser,LogDate,FieldValues) VALUES(p_CADID,p_TableName,user,sysdate,v_ColumnValue); EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20348, 'Kein Wert'); END LogSachDat;
  5. Es ist mir schon bewusst, dass das Selektieren der Felder aus der all_Tables auf die Performance geht. Habe anfangs auch vorgehabt für die zu loggenden Tabellen jeweils einen eigenen Trigger zu erstellen. Es sind momentan an die 300 Tabelle die geloggt werden müssen. Bei einer Änderung der Triggerm muss ich 300mal ran. So ändere ich es einmalig in der Prozedur. Danke für den Tipp mit EXECUTE IMMEDIATE. Das SQL-Package ist bei uns nicht installiert. Werde die Prozedur umbauen und berichten.
  6. Hallo Zusammen, habe eine Prozedur erstellt, welche einen gelöschten Datensatz in eine Log-Tabelle protokolliert. Die Prozedur wird von einem Delete-Trigger, der den zu behandelnden Tabellen zugeordnet ist, ausgeführt. Als Parameter werden der eindeutige Schlüssel (p_CADID), die Schlüsselspalte (p_PKColumn) und der Tabellenname (p_TableName) übergeben. In der Prozedur wird ein Cursor (c_Table) erstellt, welcher die Felder und deren Datentypen der zu behandelnden Tabelle enthält. Danach geht man durch alle Felder (For-Schleife) und sammelt alle Werte, setzt diese in einen String (v_ColumnValue) zusammen und fügt danach die Werte in die Log-Tabelle ein. Die Prozedur wurde ohne Fehlermeldung angelegt. Wenn ich die Parameter übergebe, führt er die Prozedur aus, aber es wird nichts in die Log-Tabelle geschrieben. Habe die Prozedur auch mit dem PLSQL-Developer debuggt. Bei der For-Schleife steigt er aus, da r_Table und c_Table Null-Werte haben. Möglicherweise ist beim Cursor der Bug, finden diesen aber nicht. Anbei die Prozedur: CREATE OR REPLACE PROCEDURE LogSachDat( p_CADID VARCHAR2, p_PKColumn VARCHAR2, p_TableName VARCHAR2) IS v_Value VARCHAR2(4000); v_DataType VARCHAR2(4000); v_ColumnValue VARCHAR2(4000); c_Statement INTEGER; -- Cursor erstellen CURSOR c_Table IS SELECT column_name, data_type FROM all_tab_columns WHERE table_name = p_TableName ORDER BY COLUMN_ID; BEGIN FOR r_Table IN c_Table LOOP -- jeden einzelnen Wert der Spalte abfragen c_Statement := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(c_Statement, 'SELECT '||r_Table.column_name||' FROM '||p_TableName||' WHERE '||p_PKColumn||' = '||p_CADID, DBMS_SQL.NATIVE); v_Value := DBMS_SQL.EXECUTE (c_Statement); DBMS_SQL.CLOSE_CURSOR(c_Statement); -- die abgefragten Werte zusammenfassen v_ColumnValue := v_ColumnValue||';'||v_Value; END LOOP; das erste Zeichen entfernen v_ColumnValue := LTRIM(v_ColumnValue,';'); -- die Werte einfügen INSERT INTO visdat_Log(CADID,TableName,LogUser,LogDate,FieldValues) VALUES(p_CADID,p_TableName,user,sysdate,v_ColumnValue); EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20348, 'Kein Wert'); END LogSachDat; Würde mich freuen, wenn mir jemand helfen kann. Schöne Grüße, janosch

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...