Dusan Kolesar wrote : > > > Dusan Kolesar wrote : > > > >> >> > >> >> Hello, > >> >> is it possible to access trigger variables in dinamic sql > >> statement: > >> >> > >> >> CREATE TRIGGER EMPLOYEE_UPDATE FOR EMPLOYEE AFTER UPDATE EXECUTE > >> >> ( > >> >> VAR > >> >> EVENTTABLEID FIXED(10); > >> >> COLNAME VARCHAR(30); > >> >> STMT VARCHAR(100); > >> >> COLCHNG FIXED(38); > >> >> I FIXED (38); > >> >> > >> >> SET COLCHNG = 0; > >> >> SET I = 1; > >> >> > >> >> DECLARE COLNAME_CURSOR CURSOR FOR > >> >> SELECT COLUMNNAME FROM DOMAIN.COLUMNS WHERE TABLENAME = > >> >> 'EMPLOYEE'; > >> >> WHILE ($RC <> 100) DO > >> >> BEGIN > >> >> FETCH COLNAME_CURSOR INTO :COLNAME; > >> >> SET stmt = 'IF (OLD.' || colName || ' <> NEW.' || > >> >> colName || ') THEN > >> >> SET colChng = ' || colChng|| ' + ' || i; > >> >> EXECUTE stmt; > >> >> SET I = I*2; > >> >> END; > >> >> > >> >> CALL ADMIN.GENERATE_EVENTS(1, :OLD.ID, 2, :COLCHNG); > >> >> ) > >> >> > >> >> EXECUTE stmt; doesn't work > >> >> it should do next task: > >> >> IF (NEW.COLNAME <> OLD.COLNAME) THEN > >> >> SET colChng = colChng + i; > >> >> for every column of table "EMPLOYEE" but returns an error. > >> >> > >> >> Can I obtain such result in trigger code ? > >> >> > >> >> Thank you for your support, Dusan. > >> >> > >> >> > >> > > >> > Sorry, but this is not possible. You can't create > >> statements of the PL > >> > language dynamically at runtime. This is possible for > sql statements > >> > only. > >> > > >> > Best Regards, > >> > Thomas > >> > > >> > > >> > >> Hello Thomas, > >> When dynamic statement is not available for PL/SQL > >> is it posible to do something like this in trigger: > >> stmt = > >> 'DECLARE MYCURSOR CURSOR FOR ' || > >> 'SELECT CASE WHEN OLD.' || colName || ' <> NEW.' || > >> colName || ' THEN > >> 0 ELSE 1 END ' || > >> 'FROM ADMIN.DUAL'; > >> EXECUTE stmt; > >> FETCH MYCURSOR INTO :result; > >> > >> Or it is not aloved to use OLD.COLUMNNAME, NEW.COLUMNNAME > in dynamic > >> statement at all ? > >> > >> Thank you for response, Dusan > >> > > > > Yes and no ! > > First yes, you can create and execute the dynamic declare cursor > > statement. > > But you'll not able to compile the fetch statement, because > the cursor > > MYCURSOR must exist at compile time, which isn't true. > > > > Besides, I don't understand the sense of that trigger. How is it > > possible, that an update changes the > > column names of the firing table, i.e. how can OLD.<column name> and > > NEW.<column name> ever differ ? > > > > Best Regards, > > Thomas > > > > Hello > I want to find out in UPDATE trigger if value of some column > was changed > or not. > I want to make some change list with information which column > was changed. > So, maybe statement : > stmt = 'SELECT 1 FROM FROM ADMIN.DUAL WHERE OLD.' || colName > || ' <> NEW.' > || colName'; > EXECUTE stmt; > IF $rc = 0 THEN > INSERT INTO CHNGTABLE ('column' || colName || 'was changed'); > will work ? > But this gives me an error "Table must be in from list". > Is it only syntax problem, or it is not possible to access > old and new > values in trigger dynamicly? > > > Regards, Dusan >
Ok, I understand. Unfortunately the code above is no possible solution, since it's not possible to specify OLD and NEW as tables in SQL statements inside trigges. I think you have to compare each column explicitly, i.e. if you have a table T(COL1, COL2, COL3, ...), the code would look like IF OLD.COL1 <> NEW.COL1 THEN COLCHNG = COLCHNG + 1; IF OLD.COL2 <> NEW.COL2 THEN COLCHNG = COLCHNG + 1; IF OLD.COL3 <> NEW.COL3 THEN COLCHNG = COLCHNG + 1; ... Of course, this is may be a boring job, if the table has many columns. However, it seems to be the only possible solution. Best Regards, Thomas -- MaxDB Discussion Mailing List For list archives: http://lists.mysql.com/maxdb To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]