sql >> Databasteknik >  >> RDS >> Oracle

PL/SQL-utlösarproblem

Du har visat koden i bitar. men det verkar som om du kör det du har visat tillsammans som ett skript, initialt utan uppdateringen:

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örs som ett skript i SQL Developer visar skriptutmatningsfönstret:

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

Om du sedan lägger till uppdateringssatsen i skriptet:

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

Om du sedan försöker köra uppdateringen på egen hand (som ett uttalande istället för ett skript; eller genom att välja det testet och köra som ett skript) får du verkligen:

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.

Om du frågar efter user_errors visa eller kör show errors , ser du:

PLS-00103: Encountered the symbol "UPDATE"

Problemet är att du inte slutför create trigger uttalande ordentligt. update ses som en del av samma PL/SQL-block; en ogiltig del, men fortfarande inkluderad.

När du har ett PL/SQL-block måste du avsluta det med ett snedstreck, som det förklaras i SQL*Plus-dokumentationen (vilket mest gäller SQL Developer också):

SQL-utvecklaren klagar dock inte om det sista blocket i ett skript inte har ett avslutande snedstreck, så ditt ursprungliga skript (utan uppdateringen) fungerar; i SQL*Pluss skulle det sitta vid en prompt . Det drar slutsatsen att det borde finnas där - att försöka vara till hjälp. När du lägger till update påståendet att det inte längre är slutet på skriptet så det gäller inte.

Om du lägger till ett snedstreck i ditt skript mellan PL/SQL-koden och följande SQL-sats fungerar allt:

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

och du ser nu:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled


1 row updated.



  1. Hur kan jag köra lagrad procedur som inte är fråga i JDBC

  2. Generera brödsmulor av kategorier lagrade i MySQL

  3. java enum och postgresql enum

  4. TIME_FORMAT() Exempel – MySQL