【问题标题】:#PLSQL_Trigger duplicate customer doesnt work#PLSQL_Trigger 重复客户不起作用
【发布时间】:2017-09-02 06:46:59
【问题描述】:

作业要求:创建一个触发器,其中帐户必须属于一个且仅一个客户。

我的代码如下所示不起作用。 错误消息:引用的字符串未正确终止。请帮忙。

create or replace trigger dupcust
before insert or update on ACCOUNT
for each row
declare
    v_ctn NUMBER;
begin
    select count(account.cname) into v_ctn from account where A#=:new.A#;
    if v_ctn>0 then  
        raise_application_error (-20107, 'ACCT CAN ONLY BELONG TO ONE CUSTOMER');
    end if;
end;

测试代码:

UPDATE ACCOUNT SET ACCOUNT.CNAME =’Cook’ WHERE ACCOUNT.A# = ‘1111’;

【问题讨论】:

  • A#不应该是ACCOUNT的主键吗?因此,每个帐号应该不可能有多个记录,因此一个帐户不可能有多个客户。

标签: plsql


【解决方案1】:

当我复制您的查询时,由于字符串 cook 和 1111 周围的引号而失败。您显然使用了错误的引号字符,我更正了引号,当我运行查询时,触发器生成了一个突变错误,答案可以在这里找到:

PLSQL Trigger Error. "is mutating, trigger/function may not see it" ORA-04091

基本上你正在从你正在更新的表中读取,这会导致突变,你不能这样做。

如果编写正确,复合触发器可以完成这项工作,示例如下:

Oracle trigger after insert or delete

【讨论】:

  • 嗨 Prescott,非常感谢您的 cmets 和引用!我添加了编译指示自治事务;在声明部分和触发器工作。我想知道这个编译指示自治事务是做什么的。
  • 您可以在此处阅读有关 pragmaautomatic_transaction 的信息:docs.oracle.com/cd/B19306_01/appdev.102/b14261/…,基本上它允许您在事务内部操作数据而不影响事务外部数据。
  • 自治事务不是解决这个问题的正确方法。触发代码不会在调用会话中看到新插入/更新的行,因此“验证”只会偶然成功。
猜你喜欢
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 2017-06-04
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多