【问题标题】:Creating a trigger with a case statement使用 case 语句创建触发器
【发布时间】:2013-08-24 21:39:41
【问题描述】:

我有这两张表:

USERS(username, role_id)
COMMISSION_RATES(username, commission_rate)

users.username 是主键,commission_rates.username 是外键。

我想写一个触发器,在插入用户后,检查是否role_id = 2,然后插入commission_ratesusers.username,0为佣金率。

这是我目前所拥有的,但它不起作用:

create or replace TRIGGER SETCOMISSIONRATE 
AFTER INSERT ON USERS 
BEGIN
  CASE
    WHEN users.role_id = 2 THEN
      INSERT INTO COMISSION_RATE
          (username,
           comission_rate)
        VALUES (
          :NEW.username,
        0)
END;

任何帮助将不胜感激

【问题讨论】:

  • 认为插入语句后需要一个分号

标签: sql oracle triggers insert case


【解决方案1】:

应该是这样的:

CREATE OR REPLACE TRIGGER SETCOMISSIONRATE 
AFTER INSERT ON USERS FOR EACH ROW
WHEN (new.role_id = 2)
BEGIN
    INSERT INTO COMISSION_RATE (username, comission_rate)
    VALUES (:new.username, 0);
END;

【讨论】:

  • 谢谢,当我将它输入到 sql 中时,它会在红色下划线 INSERT INTO COMISSION_RATE (broker_username, comission_rate),并且不起作用
  • 我也收到以下错误:错误(2,5):PL/SQL:SQL 语句被忽略错误(3,31):PL/SQL:ORA-00933:SQL 命令未正确结束错误( 4,4): PLS-00103: 在预期以下情况之一时遇到符号“文件结尾”:( begin case declare end exception exit for goto if loop mod null pragma raise return select update while with
  • 我已经有一段时间没有在 oracle 中编程了,但是在插入值之后添加 ; 应该可以解决问题。
【解决方案2】:

WHEN 条件必须在定义部分,而不是在正文中。它们只能用于行触发器。

create or replace
TRIGGER SETCOMISSIONRATE 
AFTER INSERT ON USERS 
FOR EACH ROW
WHEN (NEW.role_id = 2)
BEGIN
    INSERT INTO COMISSION_RATE
    (username,
    comission_rate)
    VALUES (
    :NEW.username,
    0)

END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-23
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多