简体   繁体   English

oracle,sql,触发器

[英]oracle , sql , trigger

CREATE TRIGGER "CPI"."TRGPRODOFFRPRICE" 
AFTER UPDATE or INSERT ON CPI_LOADER_EXEMPTIONS
FOR EACH ROW
DECLARE
table_name varchar(32);
BEGIN
 if substr(:new.SID_ID,1,3) = 'POP' then
  table_name := 'PROD_OFFR_PRICE_CHARGE';
 else 
  table_name := 'PROD_OFFR_PRICE_ALTERATION';
 end if;
 execute immediate 'UPDATE  :1 set CPI_EXEMPTION=:2 WHERE SID_ID=:3'   using table_name, :new.FLAG, :new.SID_ID;
END;

Based on comments i edited into this form, which looks better, but when trying to insert value into table which launches trigger i am getting error 'invalid table name', any idea what is causing this ? 基于我将其编辑为这种形式的注释,它看起来更好,但是当尝试在启动触发器的表中插入值时,出现错误“无效的表名”,是什么原因引起的? wrong tab var declaration possibly? 错误的tab var声明可能吗?

Try this (real PL/SQL): 试试这个(真正的PL / SQL):

CREATE TRIGGER trgSample
AFTER UPDATE or INSERT ON EXEMPTIONS
FOR EACH ROW
DECLARE
   sid varchar(10);
   sidVal varchar(100);
   table_name varchar(32);
   flag int;
BEGIN
  sid   := substr(:new.SID_ID,1,3);
  flag  := :new.FLAG;
  sidVal := :new.SID_ID;
  if sid = 'POP' then
    table_name := 'PROD_VAL';
  else 
    table_name := 'PROD_VAL2';
  end if;
  execute immediate 'UPDATE ' || table_name 
                    || ' set EXEMPTION=sidVal WHERE SID_ID=:x' using sidVal;
END;

AFter all only these changes were neccessary: 'change var to varchar2 for table_name:' only slight update on execute statement: 'execute immediate 'UPDATE :1 set CPI_EXEMPTION=:2 WHERE SID_ID=:3' using table_name, :new.FLAG, :new.SID_ID;' 只有所有这些更改都是必要的:'将var更改为varchar2 for table_name:'仅对执行语句进行轻微更新:'execute immediate'更新:1设置CPI_EXEMPTION =:2 WHERE SID_ID =:3'使用table_name,:new.FLAG, :new.SID_ID;”

thanks for all comments, they ´ve helped me a lot. 感谢您的所有评论,他们对我有很大帮助。 And need to say ai learn a lot. 并且需要说ai学到很多东西。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM