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