Before insert 触发器 (PL/SQL) 在 Oracle SQL Developer 中不会触发

问题描述 投票:0回答:1

我为 Oracle 的 HR 示例数据库中的 Jobs 表定义了一个简单的触发器。我正在 Oracle SQL Developer 中测试它。

set serveroutput on;
create or replace trigger insertjob
 before insert on jobs
  begin 
    dbms_output.put_line(' Hello!');
    end;

然后我故意插入一行失败,比如

INSERT INTO jobs(job_id, job_title, min_salary, max_salary) VALUES('IT_TEST', 6000, 12000); 
控制台输出为:

INSERT INTO jobs(job_id, job_title, min_salary, max_salary) VALUES('IT_TEST', 6000, 12000)
Error at Command Line : 26 Column : 61
Error report -
SQL Error: ORA-00947: not enough values
00947. 00000 -  "not enough values"
*Cause:    
*Action:

但是在插入之前没有扣动扳机。我期待着看到“你好!”的消息。就在错误之前,因为无论插入操作成功还是失败,触发器都应该触发,但那并没有发生! 有谁知道为什么吗?

最诚挚的问候, 索林

sql oracle plsql triggers oracle-sqldeveloper
1个回答
0
投票

您正在使用:

INSERT INTO jobs(
  job_id,    job_title, min_salary, max_salary
)VALUES(
  'IT_TEST', 6000,      12000       -- nothing for the 4th column
);

您已指定要

INSERT
分为 4 列,但仅提供了 3 个值。您的查询在语法上无效,因此不会执行。您的触发器没有任何问题 - 它只是没有运行,因为您的
INSERT
语句无效并且没有被执行,所以没有任何东西触发
TRIGGER

要修复此问题,请向

INSERT
提供第四个值:

INSERT INTO jobs(
  job_id,  job_title, min_salary, max_salary
)VALUES(
  'job_id', 'IT_TEST', 6000,       12000
);

或者如果您想插入默认值,请使用

DEFAULT

INSERT INTO jobs(
  job_id,  job_title, min_salary, max_salary
)VALUES(
  DEFAULT, 'IT_TEST', 6000,       12000
);

当您的查询在语法上有效时,SQL 引擎将执行它并且触发器将触发。

© www.soinside.com 2019 - 2024. All rights reserved.