当前位置: 首页 > 面试题库 >

PL / SQL触发器问题

太叔鸿博
2023-03-14
问题内容

我正在尝试编写一个触发器来填充一个包含有关雇员的最新工资信息的表。我有一个问题,我现在无法完全绕开我的头。

这是要填充的表:

 drop table SalUpdates cascade constraints;
 create table SalUpdates(
 SalSSN char(9), 
 newSalary decimal(10,2), 
 oldSalary decimal(10,2)

 );

这是我的触发器:

 create or replace trigger t1
 after update of salary on employee
 for each row
 begin
 insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);  
 end;

触发器编译没有问题,但是当我尝试运行此更新时,Oracle告诉我触发器无效。是什么原因造成的?

update employee
set salary=4000
where ssn='123456789';

问题答案:

您已按块显示了代码。但似乎您正在运行一起显示为脚本的内容,最初没有进行更新:

drop table SalUpdates cascade constraints;
create table SalUpdates(
SalSSN char(9), 
newSalary decimal(10,2), 
oldSalary decimal(10,2)
);

create or replace trigger t1
after update of salary on employee
for each row
begin
insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);  
end;

在SQL Developer中作为脚本运行时,脚本输出窗口显示:

drop table SalUpdates cascade constraints
Error report -
ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"
*Cause:    
*Action:

Table SALUPDATES created.


Trigger T1 compiled

如果然后将update语句添加到脚本中:

drop table SalUpdates cascade constraints;
create table SalUpdates(
SalSSN char(9), 
newSalary decimal(10,2), 
oldSalary decimal(10,2)
);

create or replace trigger t1
after update of salary on employee
for each row
begin
insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);  
end;

update employee
set salary=4000
where ssn='123456789';

你得到:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled

Errors: check compiler log

如果然后尝试独自运行更新(作为语句而不是脚本;或者通过选择该测试并作为脚本运行),则确实可以得到:

SQL Error: ORA-04098: trigger 'MYSCHEMA.T1' is invalid and failed re-validation
04098. 00000 -  "trigger '%s.%s' is invalid and failed re-validation"
*Cause:    A trigger was attempted to be retrieved for execution and was
           found to be invalid.  This also means that compilation/authorization
           failed for the trigger.
*Action:   Options are to resolve the compilation/authorization errors,
           disable the trigger, or drop the trigger.

如果查询user_errors视图或运行show errors,则会看到:

PLS-00103: Encountered the symbol "UPDATE"

问题是您没有create trigger正确完成该语句。该update被视为相同的PL / SQL块的一部分; 无效的部分,但仍包含在内。

当您拥有PL /
SQL块时,必须使用斜杠将其终止,如在SQL * Plus文档(大多数情况下也适用于SQLDeveloper)中所解释的那样:

SQL * Plus以与SQL命令相同的方式对待PL /
SQL子程序,除了分号(;)或空白行不会终止并执行块之外。通过在新行上单独输入一个句点(。)来终止PL /
SQL子程序。您还可以通过在新行上单独输入一个斜杠(/)来终止并执行PL / SQL子程序。

但是,SQL Developer不会抱怨脚本中的最后一个块是否没有终止斜杠,因此您的原始脚本(不进行更新)可以工作;在SQL * Plus中,它将位于提示符处。从某种意义上讲,它应该在那里-
试图有所帮助。当您添加update语句时,它不再是脚本的结尾,因此不再适用。

如果在PL / SQL代码和以下SQL语句之间在脚本中添加斜杠,则所有斜杠都有效:

drop table SalUpdates cascade constraints;
create table SalUpdates(
SalSSN char(9), 
newSalary decimal(10,2), 
oldSalary decimal(10,2)
);

create or replace trigger t1
after update of salary on employee
for each row
begin
insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);  
end;
/

update employee
set salary=4000
where ssn='123456789';

您现在看到:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled


1 row updated.


 类似资料:
  • 主要内容:创建触发器,示例在本章中,我们将讨论和学习PL/SQL中的触发器。 触发器是存储的程序,在发生某些事件时会自动执行或触发。事实上,触发器是为了响应以下任何事件而被执行的 - 数据库操作(DML)语句(,或) 数据库定义(DDL)语句(,或)。 数据库操作(,,,或)。 可以在事件关联的表,视图,模式或数据库上定义触发器。 使用触发器的好处 触发器可以用于以下目的 - 自动生成一些派生列值 强化参照完整性 事件记录

  • 我想创建ddl触发器(在创建),这将创建一个dml触发器,但我有错误: ORA-06512:8 00604. 00000-"错误发生在递归SQL级别%s"*原因:错误发生在处理递归SQL语句(适用于内部字典表的语句)。*操作:如果可以纠正堆栈上下一个错误中描述的情况,请这样做;否则请联系Oracle支持。

  • 问题内容: 我有一些代码需要调试帮助,但我认为,如果我能运行其中之一,我将可以得到其余的代码(哦,我希望如此)。 我正在尝试通过sqlplus在我学校的服务器上运行的表上执行此操作,如果有帮助的话。 问题答案: 遇到错误时,指定什么错误总是有帮助的。触发器中的调用中存在语法错误。该过程需要两个参数,一个数字和一个字符串。您传入的是一个长字符串的单个参数。 假设您的表格中有一列,则该值应有效。

  • 我环顾四周,尝试了一些我读过的解决方案。我试图创建一个pl/sql触发器,如果满足子句,它会将数据从一个表复制到另一个表。我觉得我可能只是犯了一个愚蠢的语法错误,而不是一个完全关键的错误,但希望能得到一些帮助。 以下是错误 6.4 PLS-00201:必须声明标识符“STATUS\u ID” 6 1 PL/SQL:语句被忽略

  • 我试图使用Application Express以编程方式在Oracle12c中查找PL/SQL触发器中JSON数组的长度。这将允许我循环遍历每个元素,并将数据插入到另一个表中。现在,JSON作为CLOB存储在列中,我正在将其转换为VARCHAR2。代码如下: 我在运行此触发器时得到以下错误: SQL错误消息:ORA-06502:PL/SQL:数值或值错误 ORA-06512:at“apex_05

  • SQL Server触发器是特殊的存储过程,它们会自动执行以响应数据库对象,数据库和服务器事件。 SQL Server提供三种类型的触发器: 数据操作语言(DML)触发器,它们响应针对表的INSERT,UPDATE和DELETE事件而自动调用。 数据定义语言(DDL)触发器响应CREATE,和DROP语句而触发。 DDL触发器也会响应执行类似操作的某些系统存储过程而触发。 登录触发器以响应事件而触