Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
#PLSQL\u触发器重复客户不工作_Plsql - Fatal编程技术网

#PLSQL\u触发器重复客户不工作

#PLSQL\u触发器重复客户不工作,plsql,Plsql,家庭作业要求:创建一个触发器,其中帐户必须属于且仅属于一个客户 我的代码如下所示不起作用。 错误mesg:带引号的字符串未正确终止。请帮忙 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#=:

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

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

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’;

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

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

如果正确写入复合触发器,则可以执行此操作,示例如下:


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

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

如果正确写入复合触发器,则可以执行此操作,示例如下:


账户的主键不应该是
A 35;
?因此,每个帐号不可能有多个记录,一个帐号也不可能有多个客户。难道
A\#
不应该是帐号的主键吗?因此,每个帐号不可能有多个记录,一个帐号不可能有多个客户。嗨,普雷斯科特,非常感谢你的评论和引用!我添加了pragma autonomy_事务;在声明部分,触发器起作用。我想知道这个pragma autonomic_事务是做什么的。你可以在这里阅读pragma autonomic_事务:,它基本上允许你在事务内部操作数据,而不会影响事务外部的数据。自治事务不是解决这个问题的正确方法。触发器代码在调用会话中看不到新插入/更新的行,因此“验证”只会意外成功。嗨,普雷斯科特,非常感谢您的评论和引用!我添加了pragma autonomy_事务;在声明部分,触发器起作用。我想知道这个pragma autonomic_事务是做什么的。你可以在这里阅读pragma autonomic_事务:,它基本上允许你在事务内部操作数据,而不会影响事务外部的数据。自治事务不是解决这个问题的正确方法。触发器代码在调用会话中看不到新插入/更新的行,因此“验证”只会意外成功。