sql >> Database >  >> RDS >> Oracle

Problemen met PL/SQL-trigger

Je hebt de code in stukjes weergegeven. maar het lijkt erop dat je draait wat je samen als een script hebt getoond, in eerste instantie zonder de 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;

Wanneer uitgevoerd als een script in SQL Developer, toont het scriptuitvoervenster:

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

Als u vervolgens de update-instructie aan het script toevoegt:

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

je krijgt:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled

Errors: check compiler log

Als u vervolgens de update zelf probeert uit te voeren (als een instructie in plaats van een script; of door die test te selecteren en als een script uit te voeren), krijgt u inderdaad:

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.

Als u de user_errors . opvraagt bekijken of uitvoeren show errors , je zult zien:

PLS-00103: Encountered the symbol "UPDATE"

Het probleem is dat u de create trigger niet voltooit verklaring naar behoren. De update wordt gezien als onderdeel van hetzelfde PL/SQL-blok; een ongeldig deel, maar nog steeds inbegrepen.

Als je een PL/SQL-blok hebt, moet je het beëindigen met een schuine streep, zoals uitgelegd in de SQL*Plus-documentatie (wat meestal ook van toepassing is op SQL Developer):

SQL Developer klaagt niet als het laatste blok in een script geen afsluitende slash heeft, dus je originele script (zonder de update) werkt; in SQL*Plus zou het op een prompt zitten . Het leidt er min of meer uit dat het er zou moeten zijn - in een poging behulpzaam te zijn. Wanneer u de update . toevoegt statement is het niet langer het einde van het script, dus dat is niet van toepassing.

Als je een schuine streep aan je script toevoegt tussen de PL/SQL-code en het volgende SQL-statement, werkt het allemaal:

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

en je ziet nu:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled


1 row updated.



  1. Hoe optimaliseer ik een database voor superstring-query's?

  2. Hoe het REAL-type naar NUMERIEK af te ronden?

  3. Gegevensvisualisatie in Microsoft Power BI

  4. Hoe rijen dynamisch naar kolommen te transponeren in MySQL