【问题标题】:inserting into relational table from entity table从实体表插入关系表
【发布时间】:2021-04-15 06:44:25
【问题描述】:

您好,我想创建一个触发器,在将值插入实体表 ACCOUNTS 后,该触发器将在关系表 A_EQ、A_U 和 A_P 上插入值。如果只有 ACCOUNTS.TYPE='Equipments',值将插入 A_EQ,如果只有 ACCOUNTS.TYPE='Utility',则插入 A_U,其余插入 A_P。 每当我尝试编译触发器时,都会显示某些错误:

Error(40,13): PLS-00049: bad bind variable 'NEW.A_U'
Error(41,13): PLS-00049: bad bind variable 'NEW.A_U'
Error(42,13): PLS-00049: bad bind variable 'NEW.A_U'
Error(45,9): PLS-00049: bad bind variable 'NEW.A_EQ'
Error(46,13): PLS-00049: bad bind variable 'NEW.A_EQ'
Error(47,13): PLS-00049: bad bind variable 'NEW.A_EQ'
Error(50,9): PLS-00049: bad bind variable 'NEW.A_P'
Error(51,13): PLS-00049: bad bind variable 'NEW.A_P'
Error(52,13): PLS-00049: bad bind variable 'NEW.A_P'
Error(57,4): PLS-00103: Encountered the symbol ";" when expecting one of the following:     if 

触发代码如下:

create or replace trigger accounts_relational_insert
 after insert   on accounts

REFERENCING NEW AS new OLD AS Old


for each row 
declare
sys_month VARCHAR2 (10) ;
i_month VARCHAR2 (10);
old1 int;
curr_amount number (20,2);
curr_id varchar2 (20);
curr_txn varchar2 (20);
curr_type varchar2 (20);
begin
select to_char(SYSDATE,'Month')  into sys_month from dual;
select ACCOUNTS_ID_SEQ.currval into old1 from dual;
select to_char(paid_on,'Month') into i_month from accounts where  transaction_id ='Txn' || lpad(old1,9,'0');
select amount  into curr_amount from accounts where transaction_id='Txn' || lpad(old1,9,'0');
select  id into curr_id from accounts where transaction_id='Txn' || lpad(old1,9,'0');
select transaction_id into curr_txn from accounts where transaction_id='Txn' || lpad(old1,9,'0');
select type into curr_type from accounts where transaction_id='Txn' || lpad(old1,9,'0');
if i_month = sys_month then
    if curr_type ='Utility' then 
            :new.a_u.transaction_id := curr_txn;
            :new.a_u.u_id :=curr_id;
            :new.a_u.amount := curr_amount;
            
    else if curr_type='Equipments' then
        :new.a_eq.transaction_id := curr_txn;
            :new.a_eq.eq_id :=curr_id;
            :new.a_eq.amount := curr_amount;
     else
     
        :new.a_p.transaction_id := curr_txn;
            :new.a_p.barcode:=curr_id;
            :new.a_p.amount := curr_amount;
            
    end if;
end if;

end;

表格如下:

如果有人告诉我如何解决此错误,以及在帐户表上插入后是否有任何其他方法可以插入到关系表中,这将非常有帮助。

【问题讨论】:

    标签: oracle plsql oracle11g triggers


    【解决方案1】:

    您可以像这个一样简单地重新安排触发器

    CREATE OR REPLACE TRIGGER accounts_relational_insert
      AFTER INSERT ON accounts
      FOR EACH ROW
    BEGIN
      IF TO_CHAR(:new.paid_on, 'YYYYMM') = TO_CHAR(sysdate, 'YYYYMM') THEN
        IF    :new.type = 'Utility' THEN
          INSERT INTO a_u VALUES(:new.id, :new.transaction_id, :new.amount);
        ELSIF :new.type = 'Equipments' THEN
          INSERT INTO a_eq VALUES(:new.id, :new.transaction_id, :new.amount);    
        ELSE
          INSERT INTO a_p VALUES(:new.id, :new.transaction_id, :new.amount);
        END IF;
      END IF;
    END;
    /
    

    在哪里

    • 已经能够从标识符中获取的值 表 accounts 的列符合 :new ,为 插入的不应从 SELECT 语句返回。此外,你会发生变异 这种情况下触发错误。

    • 确实,不需要定义局部变量,因为事实上 上面表达的,还有i_monthsys_month的值 将直接从TO_CHAR(:new.paid_on, 'YYYYMM')TO_CHAR(sysdate, 'YYYYMM') 分别。顺便说一句,不喜欢使用字符串 字符转换中的表达式,例如 Month,因为您可能不会 只面临区分大小写的问题,但也可能在国际上失败 与语言差异相关的研究。

    • 触发器是在accounts 表上创建的,对于您其他的表 应该使用INSERT 语句,不能使用这样的变量赋值。

    • 表达式REFERENCING NEW AS new OLD AS old 是多余的,因为 默认。

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多