创建 Oracle SQL 触发器错误

Posted

技术标签:

【中文标题】创建 Oracle SQL 触发器错误【英文标题】:Creating Oracle SQL Trigger Error 【发布时间】:2018-05-15 03:24:42 【问题描述】:

这是我需要完成的:创建一个名为 tgr_customer_insert 的触发器,它将在将一行插入到客户表中后触发。 触发器可以在您创建 cardholder 表之后创建,因此它可以在刚刚创建的同一个 ps16a.sql 文件中。当向 temp_table_customers 表中插入一行时,此触发器将向 cardholder 表中插入一行。以下是要插入的列: card_number(这是使用 seq_cardholder 序列号插入的) customer_id(这是 temp_table_customer 表中使用 :new.column_name 语法的绑定变量) credit_limit(这是 temp_table_customer 表中使用 :new.column_name 语法的绑定变量)

这是我的代码:

`CREATE OR REPLACE TRIGGER tgr_customer_insert
AFTER INSERT
   ON customers
   FOR EACH ROW
BEGIN
   -- Insert record into customers table
   INSERT INTO cardholder
   ( card_number,
     customer_id,
     credit_limit
   )
   VALUES
   ( new.seq_cardholder,
     :new.customer_id,
     :new.credit_limit
   );
END;

`

错误是:ORA-24344:编译错误成功 第 3 行位置 4。

头发被扯掉了。提前感谢您抽出时间处理此事。

【问题讨论】:

错误的详细信息是:PL/SQL: SQL 语句被忽略 使用show errors 获取完整的错误信息 【参考方案1】:

我认为您在 INSERT VALUES 中缺少用于第一个值绑定的“:”。

CREATE OR REPLACE TRIGGER tgr_customer_insert
AFTER INSERT
   ON customers
   FOR EACH ROW
BEGIN
   -- Insert record into customers table
   INSERT INTO cardholder
   ( card_number,
     customer_id,
     credit_limit
   )
   VALUES
   ( :new.seq_cardholder,
     :new.customer_id,
     :new.credit_limit
   );
END;

如果“seq_cardholder”是一个序列,那么你必须使用如下:

CREATE OR REPLACE TRIGGER tgr_customer_insert
AFTER INSERT
   ON customers
   FOR EACH ROW
BEGIN
   -- Insert record into customers table
   INSERT INTO cardholder
   ( card_number,
     customer_id,
     credit_limit
   )
   VALUES
   ( seq_cardholder.nextval,
     :new.customer_id,
     :new.credit_limit
   );
END;

【讨论】:

我在发布之前尝试过,但我得到:ORA-24344:编译错误成功 更多细节显示:PLS-00049: bad bind variable 'NEW.SEQ_CARDHOLDER' 没关系,你是对的。这是我创建的序列,您的代码成功创建了触发器。

以上是关于创建 Oracle SQL 触发器错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle PL/SQL 中创建触发器时如何解决“编译错误成功”错误?

SQL Oracle中的触发错误[关闭]

创建 Oracle 序列触发器

PL/SQL Oracle 错误处理

带有动态 sql 的 PL/SQL 触发器

基本 Oracle 触发器审计表