sql >> Database teknologi >  >> RDS >> Oracle

PL/SQL-udløserproblemer

Du har vist koden i bidder. men det ser ud til, at du kører det, du har vist sammen som et script, i første omgang uden opdateringen:

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;

Når det køres som et script i SQL Developer, viser scriptoutputvinduet:

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

Hvis du derefter tilføjer opdateringssætningen til scriptet:

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';

du får:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled

Errors: check compiler log

Hvis du derefter prøver at køre opdateringen på egen hånd (som en erklæring i stedet for et script; eller ved at vælge den test og køre som et script), får du faktisk:

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.

Hvis du forespørger på user_errors se, eller kør show errors , vil du se:

PLS-00103: Encountered the symbol "UPDATE"

Problemet er, at du ikke fuldfører create trigger redegørelse korrekt. update bliver set som en del af den samme PL/SQL-blok; en ugyldig del, men stadig inkluderet.

Når du har en PL/SQL-blok, skal du afslutte den med en skråstreg, som det forklarer i SQL*Plus-dokumentationen (hvilket for det meste også gælder for SQL Developer):

SQL Developer klager dog ikke over, at den sidste blok i et script ikke har en afsluttende skråstreg, så dit originale script (uden opdateringen) virker; i SQL*Plus ville den sidde ved en prompt . Det udleder på en måde, at det burde være der - forsøger at være nyttigt. Når du tilføjer update sætning er det ikke længere slutningen af ​​scriptet, så det gælder ikke.

Hvis du tilføjer en skråstreg til dit script mellem PL/SQL-koden og følgende SQL-sætning virker det hele:

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';

og du ser nu:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled


1 row updated.



  1. sql oracle - fjern dubletværdi

  2. sql self-join tabel fjern duplikerede linjer

  3. @Tailable(spring-data-reactive-mongodb) svarende til spring-data-r2dbc

  4. PostgreSQL:Hvorfor kan psql ikke oprette forbindelse til serveren?