Hi David, My post was for the actual problem. Anyways, your inputs are very right and very accurate, thanks for them.
just one thing the person who rose the question is a "she" not "he". -Sonty On Jul 27, 11:23 pm, ddf <orat...@msn.com> wrote: > Comments embedded. > > On Jul 27, 9:31 am, sonty <saurabh.zen...@gmail.com> wrote: > > > Hi, > > > Correct me if I am wrong, anybody can do so :-). > > > What you are saying is that "Getting the column name dynamically when > > the columns are static" because all of us knows that update statements > > cannot change the column name anyways. > > I don't know what you mean by that, but a basic reading indicates an > answer of 'no'. The OP is attempting to use > > :OLD.<variable_name> > and > :NEW.<variable_name> > > to reference values in the :OLD and :NEW 'blocks' populated during an > insert/update/delete where <variable_name> stores the desired column > name. Oracle will not process that type of construct in a trigger; it > needs the actual column name: > > :OLD.mycol > and > :NEW.mycol > > (in this example). The example I provided proves this. > > > > > Column name can be updated inside alter table statements. > > Yes. What that has to do with the issue presented by the OP is a > mystery to me. > > > > > So, Please let us know the exact requirement to get the solution you > > want. > > It's clear, really: he wants to use some variable to identify the > desired column name in a trigger and have the :OLD and :NEW > constructs recognize that as valid. He has already seen such code > fails, yet continues to try to make it work.. > > > > > > > -Sonty > > > On Jul 25, 4:32 am, ddf <orat...@msn.com> wrote: > > > > On Jul 24, 5:31 pm, Priya <chavanpr...@gmail.com> wrote: > > > > > David, > > > > thank you for the reply.I know that the problem can easily be solved > > > > by using the actual column name mycol instead of the variable.But, > > > > I want know if there is a way to get the column name dynamically from > > > > a variable. > > > > > On Jul 24, 2:54 pm, ddf <orat...@msn.com> wrote: > > > > > > Comments embedded. > > > > > > On Jul 24, 1:55 pm, Priya <chavanpr...@gmail.com> wrote: > > > > > > > Hi, > > > > > > > I am a oracle PL/SQL newbie.Can someone please help me solve the > > > > > > below > > > > > > problem? > > > > > > > Consider a table called mytable with one column called mycol .I have > > > > > > written a on-update trigger. > > > > > > > CREATE OR REPLACE TRIGGER "testtrigger" BEFORE > > > > > > UPDATE ON mytable FOR EACH ROW > > > > > > DECLARE > > > > > > Test VARCHAR(1000); > > > > > > > BEGIN > > > > > > > TEST:='mycol'; > > > > > > IF :OLD.TEST <> :NEW.TEST THEN > > > > > > DBMS_OUTPUT.PUT_LINE ("Hi"); > > > > > > END IF > > > > > > > i get the error bad bind variable.This is obviously because the > > > > > > compiler is thinking that test is a column and not a variable. > > > > > > Correct. That's not the only error in your code, though. > > > > > > > How > > > > > > should I make the compiler aware that Test is a variable and the > > > > > > compiler must resolver it to mycol? > > > > > > You cannot. This is a trigger, against a specific table, and the > > > > > blocks you're referencing (:OLD and :NEW) only apply to the columns > > > > > defined in that table, not to variables you may have a whim to create. > > > > > > > I know i can replace the variable > > > > > > with mycol but that not what I want to do. > > > > > > You're trigger won't compile and won't run, and updates to mytable > > > > > will fail: > > > > > > SQL> -- > > > > > SQL> -- Create test table > > > > > SQL> -- > > > > > SQL> create table mytable( > > > > > 2 mycol varchar2(20) > > > > > 3 ); > > > > > > Table created. > > > > > > SQL> > > > > > SQL> -- > > > > > SQL> -- Create bad trigger > > > > > SQL> -- > > > > > SQL> -- Won't work because TEST is not a column > > > > > SQL> -- in mytable > > > > > SQL> -- > > > > > SQL> CREATE OR REPLACE TRIGGER "testtrigger" BEFORE > > > > > 2 UPDATE ON mytable FOR EACH ROW > > > > > 3 DECLARE > > > > > 4 Test VARCHAR(1000); > > > > > 5 > > > > > 6 > > > > > 7 BEGIN > > > > > 8 > > > > > 9 > > > > > 10 TEST:='mycol'; > > > > > 11 IF :OLD.TEST <> :NEW.TEST THEN > > > > > 12 DBMS_OUTPUT.PUT_LINE ("Hi"); > > > > > 13 END IF; > > > > > 14 > > > > > 15 END; > > > > > 16 / > > > > > > Warning: Trigger created with compilation errors. > > > > > > SQL> > > > > > SQL> show errors > > > > > No errors. > > > > > SQL> > > > > > SQL> -- > > > > > SQL> -- Insert data > > > > > SQL> -- > > > > > SQL> > > > > > SQL> insert all > > > > > 2 into mytable > > > > > 3 values('Yarg') > > > > > 4 into mytable > > > > > 5 values('Yink') > > > > > 6 into mytable > > > > > 7 values('Yorg') > > > > > 8 select * From dual; > > > > > > 3 rows created. > > > > > > SQL> > > > > > SQL> commit; > > > > > > Commit complete. > > > > > > SQL> > > > > > SQL> -- > > > > > SQL> -- Perform update which fails > > > > > SQL> -- > > > > > SQL> > > > > > SQL> set serveroutput on size 1000000 > > > > > SQL> > > > > > SQL> update mytable set mycol='Fred'; > > > > > update mytable set mycol='Fred' > > > > > * > > > > > ERROR at line 1: > > > > > ORA-04098: trigger 'BING.testtrigger' is invalid and failed re- > > > > > validation > > > > > > SQL> > > > > > SQL> -- > > > > > SQL> -- Create trigger > > > > > SQL> -- > > > > > SQL> CREATE OR REPLACE TRIGGER "testtrigger" BEFORE > > > > > 2 UPDATE ON mytable FOR EACH ROW > > > > > 3 BEGIN > > > > > 4 > > > > > 5 > > > > > 6 IF :OLD.mycol <> :NEW.mycol THEN > > > > > 7 DBMS_OUTPUT.PUT_LINE ('Hi'); > > > > > 8 END IF; > > > > > 9 > > > > > 10 END; > > > > > 11 / > > > > > > Trigger created. > > > > > > SQL> > > > > > SQL> show errors > > > > > No errors. > > > > > SQL> > > > > > SQL> -- > > > > > SQL> -- Perform update > > > > > SQL> -- > > > > > SQL> > > > > > SQL> update mytable set mycol='Fred'; > > > > > Hi > > > > > Hi > > > > > Hi > > > > > > 3 rows updated. > > > > > > SQL> > > > > > > Sometimes what you want to do and what you must do are two different > > > > > things. > > > > > > > Thanks in advance! > > > > > > > Priya > > > > > > David Fitzjarrell- Hide quoted text - > > > > > - Show quoted text - > > > > It's clear you do not understand the OLD and NEW 'blocks' used by a > > > trigger. These 'blocks' reference the existing column values for the > > > row being processed (:OLD) and the pending column values (:NEW) for > > > that same row. As such these structures reference COLUMN names, not > > > variables, and there is no possible way to do what you want. As I > > > said in my prior post you're writing a trigger against a specific > > > table which has a specific definition and the trigger knows the column > > > names set by that definition. Please read here: > > > >http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_... > > > > David Fitzjarrell- Hide quoted text - > > > > - Show quoted text -- Hide quoted text - > > > - Show quoted text - > > David Fitzjarrell- Hide quoted text - > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Oracle PL/SQL" group. To post to this group, send email to Oracle-PLSQL@googlegroups.com To unsubscribe from this group, send email to oracle-plsql-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/Oracle-PLSQL?hl=en -~----------~----~----~----~------~----~------~--~---