sql - 在插入第三个表之前,如何使用触发器从两个表中获取日期?

标签 sql oracle plsql compiler-errors database-trigger

我正在尝试创建一个触发器TrgDisAmount,以便从PROD_NAME表中读取PRICEPRODUCT,并为每个插入了DISCOUNTAMOUNT值的新行计算SALES表的SERIALPCODE

这些是表格信息

Table SALES (SERIAL, PCODE, PROD_NAME, PRICE, DISCOUNT, AMOUNT)

Table PRODUCT (PCODE, PROD_NAME, PROD_CAT, PRICE)

Table DISCOUNT (PROD_CAT, DISCOUNT_RATE)

注意:
  • 仅输入SERIALPCODE的值,其余列应仅由触发器TrgDisAmount输入
  • 使用函数DISCOUNT_RATE获取GetDiscount

  • 我已经创建了GetDiscount函数来从表DISCOUNT_RATE中获取DISCOUNT

    这是我的尝试:
    create or replace trigger TrgDisAmount
      before insert on SALES for each row
    begin
      if :new.PCODE = :old.PRODUCT.PCODE then
    
        :new.PROD_NAME := :old.PRODUCT.PROD_NAME;
        :new.PRICE := :old.PRODUCT.PRICE;
        :new.DISCOUNT := :old.product.PRICE / (GetDiscount(:old.PRODUCT.PROD_CAT));
        :new.AMOUNT := :new.PRICE - :new.DISCOUNT;
      end if;
    
      insert into SALES columns (PROD_NAME, PRICE, DISCOUNT, AMOUNT) 
      values (:new.PROD_NAME, :new.PRICE, :new.DISCOUNT, :new.AMOUNT);
    end;
    /
    

    当我运行该块时,它向我显示此错误:
    PLS-00049: bad bind variable 'OLD.PRODUCT'
    

    我使用Table_Name.Column_name到达特定的列。这样做合法吗?

    样本输出应如下所示:
    SQL> insert into sales values (1,'MB-101',null, null, null, null);
    
    Result in SALES table:
       SERIAL : 1,
       PCODE : MB-101,
       PROD_NAME : IPHONE 6+,
       PRICE : 250 ,
       DISCOUNT : 25,
       AMOUNT : 225
    

    最佳答案

    创建插入前触发器时,只需设置:new值。您实际上并没有插入表格。那是处理的下一步。

    另外,在insert触发器中,仅引用:new值,而不是:old。没有:old值,这是您遇到的特定错误。

    然后,您需要执行查询以从其他表中获取相关信息。结果应如下所示:

    create or replace trigger TrgDisAmount
    before insert on SALES
    for each row
    begin
        select p.price / d.discount into :new.discount
        from product p join
             discount d
             on p.prod_cat = d.prod_cat
        where :new.pcode = p.pcode;
        :new.AMOUNT := :new.PRICE - :new.DISCOUNT;
    end;
    

    定义折扣的算法看起来非常可疑。使用此方法,将有10%的折扣表示为1.11。但是,这是您问题中的算法,您没有提供示例数据来建议任何其他方法。

    关于sql - 在插入第三个表之前,如何使用触发器从两个表中获取日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30953917/

    相关文章:

    c# - 将 Datetime2 转换为smalldatetime 触发器

    java - JPA Criteria API 在 order by 语句中使用 ISNULL

    mysql - 请需要复杂的分层 SQL 查询帮助!

    java - 如何从oracle中的hibernate元数据获取列注释?

    oracle - 请求超出了oracle数据库允许的最大限制

    php - 在 Oracle 中使用触发器记录对表的更改

    Mysql DISTINCT 无法在我的语言中正常工作

    sql - 调整/重写具有许多左外连接和重型表的 SQL 查询

    sql - 过程创建所需的简单初学者 Oracle PL/SQL 帮助/修复

    java - 使用 JDBC 编写带有绑定(bind)变量的匿名 PL/SQL block