【问题标题】:Oracle 10g triggerOracle 10g 触发器
【发布时间】:2016-09-28 13:11:15
【问题描述】:

我是 Oracle (10g) 数据库的新手。

我的问题是我不确定语法,我需要为 Oracle 数据库重写此触发器:

CREATE OR REPLACE TRIGGER trigger
BEFORE INSERT OR UPDATE
ON table
FOR EACH ROW
BEGIN
    IF :NEW.date > SYSDATE THEN
         RAISE_APPLICATION_ERROR(-20950, 'Error!');
    END IF;
END;

【问题讨论】:

  • 为什么不直接运行它看看它是否有效?
  • 如果代码行得通,你认为我会在这里写吗?
  • 如果没有,分享错误(如果有的话)或解释错误行为(如果没有错误)真的会帮助我们帮助你。
  • 一位编辑在new、then和if附近发现了错误,但我不能说更具体的了。
  • 这是您的实际(=复制粘贴)代码吗?因为triggertable 是保留字,所以不能用作名称。

标签: oracle triggers oracle10g


【解决方案1】:

您提到您更改了触发器和表的名称,但是,我将在此处再次指出(为了完整起见):

我看到了 3 个错误:

  1. “触发器”是保留字。我在下面的例子中改为“ctrigger”。
  2. “表”是保留字。我在下面的示例中更改为“垃圾”。
  3. “日期”是保留字。我在下面的示例中更改为“cdate”。
  4. 我现在假设“cdate”是DATE 数据类型。

以下代码正常运行..尝试在您的系统上“按原样”运行它,看看它是否有效?

如果确实如此,但在您的桌子上仍然失败,那么我们肯定需要查看您的桌子的定义以进一步排除故障。

  drop table junk;

  create table junk ( id   number,
                      cdate    date );

  CREATE OR REPLACE TRIGGER ttrigger
  BEFORE INSERT OR UPDATE
  ON junk
  FOR EACH ROW
  BEGIN
      IF :NEW.cdate > SYSDATE THEN
           RAISE_APPLICATION_ERROR(-20950, 'Error!');
      END IF;
  END;
  /

测试结果如下:

  SQL  > create table junk ( id   number,
                      cdate    date );
    2
  Table created.

  Elapsed: 00:00:00.07
  SQL  > CREATE OR REPLACE TRIGGER ttrigger
  BEFORE INSERT OR UPDATE
  ON junk
  FOR EACH ROW
  BEGIN
      IF :NEW.cdate > SYSDATE THEN
           RAISE_APPLICATION_ERROR(-20950, 'Error!');
      END IF;
  END;
  /

  Trigger created.

  Elapsed: 00:00:00.20
  SQL  > show err
  No errors.
  SQL  >

【讨论】:

  • 感谢您的解决方案,但问题是表和属性的名称必须用引号引起来。
  • 这有什么关系?您在表名周围使用引号,因为表名包含混合大小写。这与触发代码、我写的内容或它的工作原理无关...请发布您的表定义..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 2012-04-04
  • 2011-04-01
  • 2020-07-15
  • 1970-01-01
  • 2017-12-03
  • 2012-04-01
相关资源
最近更新 更多