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]

Reply via email to