I am getting ORA-01410 and ORA-06512 for the following block of code in a trigger I'm firing for deletion of a record in my table.
Are the calls correct ?
getlong ('xxx', 'YYY', :OLD.ROWID),
getlong ('XXX', 'yyy', :NEW.ROWID)
There seems to be a problem in the way I'm passing OLD.ROWID and NEW.ROWID; there are OLD.ROWID and NEW.ROWID in the tables that I'm updating once the triggers are fired.
Here is the getlong stored procedure:
CREATE OR REPLACE FUNCTION getlong (p_tname IN VARCHAR2, -- table name
p_cname IN VARCHAR2, -- column name
p_rowid IN ROWID)
RETURN VARCHAR2
AS
l_cursor INTEGER DEFAULT DBMS_SQL.open_cursor;
l_n NUMBER;
l_long_val VARCHAR2 (4000);
l_long_len NUMBER;
l_buflen NUMBER := 4000;
l_curpos NUMBER := 0;
BEGIN
-- Usage:
-- select getlong('TABLENAME', 'COLUMNNAME', rowid) from TABLENAME;
DBMS_SQL.
parse (l_cursor,
'select ' || p_cname || ' from ' || p_tname || ' where rowid = :x',
DBMS_SQL.native);
DBMS_SQL.bind_variable (l_cursor, ':x', p_rowid);
DBMS_SQL.define_column_long (l_cursor, 1);
l_n := DBMS_SQL.execute (l_cursor);
IF (DBMS_SQL.fetch_rows (l_cursor) > 0)
THEN
DBMS_SQL.column_value_long (l_cursor,
1,
l_buflen,
l_curpos,
l_long_val,
l_long_len);
END IF;
DBMS_SQL.close_cursor (l_cursor);
RETURN l_long_val;
END getlong;
/
Thanks for helping.
:old
and:new
pseudorecords so it must be a row-level trigger. Are you certain that therowid
values that you are getting from these psrudorecords are valid in the context of the function call? It looks like you're trying to work around a mutating table exception which causes you to look for arowid
that either does not yet exist in the context of the function call or that no longer exists in the context of the function call.