Oracle
 sql >> база данни >  >> RDS >> Oracle

Проблеми с тригера на PL/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;

Когато се изпълнява като скрипт в 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

Ако след това добавите израза за актуализиране към скрипта:

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 (което най-вече се отнася и за SQL Developer):

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. въпрос относно програмен текст, съхранен в pl/sql

  2. Променлива на динамична схема на Oracle SQL оператор

  3. Създаване на тригери

  4. Процедурата в Oracle не се изпълнява

  5. TO_char връща стойност на наклонена черта след преобразуване на число в String