【问题标题】:Oracle PL/SQL Trigger: update/insert with where conditionOracle PL/SQL 触发器:使用 where 条件更新/插入
【发布时间】:2014-06-24 21:20:29
【问题描述】:

也许这很容易,但我没有成功。表B 包含两个字段:product_no NUMBERproduct VARCHAR2。触发器应该做的是从BP-table 插入相应的产品描述,其中还有product_noproduct 字段。 例如。您在B.product_no 中输入20,那么它应该会自动从BP-Table 输入正确的产品。 Oracle 版本是 11g。

CREATE OR REPLACE TRIGGER A.trigger_on_B
AFTER INSERT OR UPDATE
ON A.B FOR EACH ROW
DECLARE
  varProduct varchar(20);
BEGIN
  SELECT bp.report_info 
    into varProduct
    from  bp, 
          B
   where bp.product_no = B.product_no;

   insert into B (product) values(varProduct) ;
exception 
  when others then NULL;
END;/

【问题讨论】:

  • 问题出在哪里?
  • 它不起作用。错误消息:错误第 51 行,第 12 列,第 51 行,第 51 行,第 18 行,找到 'varchar',期望:。 -or- ( -or- RETURN RETURNING -or- LOG -or- ;
  • 为什么?我必须定义变量吗?当我继续使用此触发器时,我收到另一个错误,即触发器“无效且重新验证失败”

标签: sql oracle oracle11g


【解决方案1】:

您可以使用伪记录 :new, :old 来使其工作:

CREATE OR REPLACE TRIGGER A.trigger_on_B
AFTER INSERT OR UPDATE
ON A.B FOR EACH ROW
DECLARE
  varProduct varchar(20);
BEGIN
  SELECT bp.report_info 
    into varProduct
    from  bp
   where bp.product_no = :new.product_no;

   insert into B (product) values(varProduct) ;
exception 
  when others then NULL;
END;
  • 去掉when others then NULL;这行不被占用,你不能隐藏任何例外。
  • 摆脱您的触发器,使用触发器中的逻辑很难维护代码。欲了解更多信息,请查看this article

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2021-02-26
    • 2013-07-01
    • 2018-10-03
    • 2012-04-20
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多