Thread: Help converting Oracle instead of triggers to PostgreSQL
I have some instead of triggers in Oracle, some update instead of triggers and some insert instead of triggers. I was thinking that I could maybe use instead of rules in PostgreSQL to get the same effect. I converted the instead of trigger in Oracle into a PostgreSQL function below: CREATE OR REPLACE FUNCTION t_vproduct() RETURNS VOID AS ' DECLARE v_productsetno numeric; v_productno numeric; v_prodqty numeric; v_setqty numeric; oldqoh numeric; newqoh numeric; --cursor to to get set number, sub-product_no and their quantities in the productset prodset_cur CURSOR IS SELECT productset_no, product_no, prod_qty FROM productset WHERE productset_no= old.product_no; BEGIN oldqoh := old.qoh; newqoh := new.qoh; --opening and fetching the cursor in the variables OPEN prodset_cur; FETCH prodset_cur INTO v_productsetno,v_productno, v_prodqty; --checking if product is a set or individual --if it is not a set then update product table IF NOT FOUND THEN UPDATE product SET qoh = qoh - (oldqoh - newqoh) WHERE product_no = old.product_no; --if itis a SET then ELSIF FOUND THEN v_setqty := (oldqoh - newqoh); --SET quantity --loop updates each sub products qoh in the set LOOP UPDATE product --multiplying quantity ofa product in a set with quantity of productset, to get total quantity of individual product in a set SET qoh = qoh - (v_prodqty * v_setqty) WHERE product_no = v_productno; FETCH prodset_cur INTO v_productsetno, v_productno, v_prodqty; EXIT WHEN NOT FOUND; END LOOP; CLOSE prodset_cur; END IF; RETURN; END; ' LANGUAGE 'plpgsql'; Then my guess for the rule is: CREATE OR REPLACE RULE r_vproduct AS ON UPDATE TO vproduct DO INSTEAD PERFORM t_vproduct(); I know that function isn't going to work the way I have it. In Oracle that function was defined as a trigger: CREATE OR REPLACE TRIGGER t_vproduct INSTEAD OF UPDATE ON v_product v_product is a view. Getting access to new and old is going to be at least one problem I can see. Perhaps I can pass in NEW and OLD into the t_vproduct function from the rule (DO INSTEAD PERFORM t_vproduct(new, old);). I'm not sure what to do. _________________________________________________________________ Take advantage of our best MSN Dial-up offer of the year � six months @$9.95/month. Sign up now! http://join.msn.com/?page=dept/dialup
> > I have some instead of triggers in Oracle, some update instead of triggers > and some insert instead of triggers. I was thinking that I could maybe use > instead of rules in PostgreSQL to get the same effect. I converted the > instead of trigger in Oracle into a PostgreSQL function below: > CREATE OR REPLACE FUNCTION t_vproduct() > RETURNS VOID AS ' > DECLARE > v_productsetno numeric; > v_productno numeric; > v_prodqty numeric; > v_setqty numeric; > oldqoh numeric; > newqoh numeric; > > --cursor to to get set number, sub-product_no and their quantities in > the productset > prodset_cur CURSOR IS > SELECT productset_no, product_no, prod_qty > FROM productset > WHERE productset_no = old.product_no; > > BEGIN > oldqoh := old.qoh; > newqoh := new.qoh; > > --opening and fetching the cursor in the variables > OPEN prodset_cur; > FETCH prodset_cur INTO v_productsetno, v_productno, v_prodqty; > > --checking if product is a set or individual > --if it is not a set then update product table > IF NOT FOUND THEN > UPDATE product > SET qoh = qoh - (oldqoh - newqoh) > WHERE product_no = old.product_no; > --if it is a SET then > ELSIF FOUND THEN > v_setqty := (oldqoh - newqoh); --SET quantity > > --loop updates each sub products qoh in the set > LOOP > UPDATE product --multiplying quantity of a product in a set > with quantity of productset, to get total quantity of individual product in > a set > SET qoh = qoh - (v_prodqty * v_setqty) > WHERE product_no = v_productno; > > FETCH prodset_cur INTO v_productsetno, v_productno, v_prodqty; > > EXIT WHEN NOT FOUND; > END LOOP; > > CLOSE prodset_cur; > END IF; > > RETURN; > END; > ' LANGUAGE 'plpgsql'; > > Then my guess for the rule is: > CREATE OR REPLACE RULE r_vproduct AS ON UPDATE > TO vproduct DO INSTEAD PERFORM t_vproduct(); > > I know that function isn't going to work the way I have it. In Oracle that > function was defined as a trigger: > CREATE OR REPLACE TRIGGER t_vproduct > INSTEAD OF UPDATE > ON v_product > > v_product is a view. Getting access to new and old is going to be at least > one problem I can see. Perhaps I can pass in NEW and OLD into the t_vproduct > function from the rule (DO INSTEAD PERFORM t_vproduct(new, old);). I'm not > sure what to do. > Not sure if this is of any help ... AFAIK there are no updatable views in pg. But aside from that, I cannot see nothing what could not be done by a pg trigger function: CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] } ON table FOR EACH { ROW | STATEMENT }EXECUTE PROCEDURE func (arguments ) Also try http://techdocs.postgresql.org/#convertfrom Converting from other Databases to PostgreSQL and/or http://openacs.org/search/search?q=oracle+to+pg+porting&t=Search HTH Regards, Christoph
Hi Christoph, Thanks for the links but the techdoc links for converting from Oracle to PostgreSQL has 2 links that don't go to their intended targets anymore, one is in the 7.3 docs which is really limited (only covers simple things), and the Ora2Pg one I don't really get that well. As far as updateable views, that's why you need instead of triggers. Regular triggers can't be done on views. So if I make an instead of trigger on a view that's for updates then I have an updateable view. I figured it out last night and I was along the right track in my original post with using an instead of rule to call a function. The trick is that I have to pass in all the old.col and new.col stuff into the function that I call from the rule. In Oracle since the instead of stuff is a trigger I had access to the new.col and old.col stuff. To do it in PostgreSQL rules I had to pass it all in. I'm going to write a doc about the problems I've encountered during my conversion project and then submit it to the Postgres people I think (to who though?). My programming and tech writing background should help I hope. Thanks for the suggestions Christoph. -Clint ----Original Message Follows---- From: Christoph Haller <ch@rodos.fzk.de> To: cstotesbery@acm.org CC: pgsql-sql@postgresql.org Subject: Re: [SQL] Help converting Oracle instead of triggers to PostgreSQL Date: Thu, 04 Dec 2003 17:16:32 MET Not sure if this is of any help ... AFAIK there are no updatable views in pg. But aside from that, I cannot see nothing what could not be done by a pg trigger function: CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] } ON table FOR EACH { ROW | STATEMENT }EXECUTE PROCEDURE func( arguments ) Also try http://techdocs.postgresql.org/#convertfrom Converting from other Databases to PostgreSQL and/or http://openacs.org/search/search?q=oracle+to+pg+porting&t=Search HTH Regards, Christoph ---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ? http://www.postgresql.org/docs/faqs/FAQ.html _________________________________________________________________ Get holiday tips for festive fun. http://special.msn.com/network/happyholidays.armx
Generally speaking you can send articles to me or to webmaster@postgresql.org for inclusion on the techdocs site. I'll try to update the links you mentioned below as well. thanks. Robert Treat On Thursday 04 December 2003 12:52, Clint Stotesbery wrote: > Hi Christoph, > Thanks for the links but the techdoc links for converting from Oracle to > PostgreSQL has 2 links that don't go to their intended targets anymore, one > is in the 7.3 docs which is really limited (only covers simple things), and > the Ora2Pg one I don't really get that well. > > As far as updateable views, that's why you need instead of triggers. > Regular triggers can't be done on views. So if I make an instead of trigger > on a view that's for updates then I have an updateable view. I figured it > out last night and I was along the right track in my original post with > using an instead of rule to call a function. The trick is that I have to > pass in all the old.col and new.col stuff into the function that I call > from the rule. In Oracle since the instead of stuff is a trigger I had > access to the new.col and old.col stuff. To do it in PostgreSQL rules I had > to pass it all in. I'm going to write a doc about the problems I've > encountered during my conversion project and then submit it to the Postgres > people I think (to who though?). My programming and tech writing background > should help I hope. Thanks for the suggestions Christoph. > -Clint > > > ----Original Message Follows---- > From: Christoph Haller <ch@rodos.fzk.de> > To: cstotesbery@acm.org > CC: pgsql-sql@postgresql.org > Subject: Re: [SQL] Help converting Oracle instead of triggers to PostgreSQL > Date: Thu, 04 Dec 2003 17:16:32 MET > > Not sure if this is of any help ... > AFAIK there are no updatable views in pg. > But aside from that, I cannot see nothing what could not be > done by a pg trigger function: > CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] } > ON table FOR EACH { ROW | STATEMENT } > EXECUTE PROCEDURE func ( arguments ) > > Also try > > http://techdocs.postgresql.org/#convertfrom > > Converting from other Databases to PostgreSQL > > and/or > > http://openacs.org/search/search?q=oracle+to+pg+porting&t=Search > > HTH > > Regards, Christoph > > > ---------------------------(end of broadcast)--------------------------- > TIP 5: Have you checked our extensive FAQ? > > http://www.postgresql.org/docs/faqs/FAQ.html > > _________________________________________________________________ > Get holiday tips for festive fun. > http://special.msn.com/network/happyholidays.armx > > > ---------------------------(end of broadcast)--------------------------- > TIP 5: Have you checked our extensive FAQ? > > http://www.postgresql.org/docs/faqs/FAQ.html -- Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL
Just to follow up I managed to track down these missing articles and have updated the links on the website. Robert Treat On Thursday 04 December 2003 12:52, Clint Stotesbery wrote: > Hi Christoph, > Thanks for the links but the techdoc links for converting from Oracle to > PostgreSQL has 2 links that don't go to their intended targets anymore, one > is in the 7.3 docs which is really limited (only covers simple things), and > the Ora2Pg one I don't really get that well. > > As far as updateable views, that's why you need instead of triggers. > Regular triggers can't be done on views. So if I make an instead of trigger > on a view that's for updates then I have an updateable view. I figured it > out last night and I was along the right track in my original post with > using an instead of rule to call a function. The trick is that I have to > pass in all the old.col and new.col stuff into the function that I call > from the rule. In Oracle since the instead of stuff is a trigger I had > access to the new.col and old.col stuff. To do it in PostgreSQL rules I had > to pass it all in. I'm going to write a doc about the problems I've > encountered during my conversion project and then submit it to the Postgres > people I think (to who though?). My programming and tech writing background > should help I hope. Thanks for the suggestions Christoph. > -Clint > > > ----Original Message Follows---- > From: Christoph Haller <ch@rodos.fzk.de> > To: cstotesbery@acm.org > CC: pgsql-sql@postgresql.org > Subject: Re: [SQL] Help converting Oracle instead of triggers to PostgreSQL > Date: Thu, 04 Dec 2003 17:16:32 MET > > Not sure if this is of any help ... > AFAIK there are no updatable views in pg. > But aside from that, I cannot see nothing what could not be > done by a pg trigger function: > CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] } > ON table FOR EACH { ROW | STATEMENT } > EXECUTE PROCEDURE func ( arguments ) > > Also try > > http://techdocs.postgresql.org/#convertfrom > > Converting from other Databases to PostgreSQL > > and/or > > http://openacs.org/search/search?q=oracle+to+pg+porting&t=Search > > HTH > > Regards, Christoph > > > ---------------------------(end of broadcast)--------------------------- > TIP 5: Have you checked our extensive FAQ? > > http://www.postgresql.org/docs/faqs/FAQ.html > > _________________________________________________________________ > Get holiday tips for festive fun. > http://special.msn.com/network/happyholidays.armx > > > ---------------------------(end of broadcast)--------------------------- > TIP 5: Have you checked our extensive FAQ? > > http://www.postgresql.org/docs/faqs/FAQ.html -- Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL