sql >> Base de Datos >  >> RDS >> Oracle

Problemas de activación de PL/SQL

Ha mostrado el código en fragmentos. pero parece que está ejecutando lo que ha mostrado como un script, inicialmente sin la actualización:

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;

Cuando se ejecuta como una secuencia de comandos en SQL Developer, la ventana de salida de la secuencia de comandos muestra:

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

Si luego agrega la instrucción de actualización al script:

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

obtienes:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled

Errors: check compiler log

Si luego intenta ejecutar la actualización por su cuenta (como una declaración en lugar de una secuencia de comandos; o seleccionando esa prueba y ejecutándola como una secuencia de comandos), obtendrá:

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.

Si consulta los user_errors ver o ejecutar show errors , verás:

PLS-00103: Encountered the symbol "UPDATE"

El problema es que no estás completando el create trigger declaración correctamente. La update se ve como parte del mismo bloque PL/SQL; una parte no válida, pero aún incluida.

Cuando tiene un bloque PL/SQL, debe terminarlo con una barra inclinada, como se explica en la documentación de SQL*Plus (que también se aplica principalmente a SQL Developer):

Sin embargo, SQL Developer no se queja si el último bloque en un script no tiene una barra diagonal final, por lo que su script original (sin la actualización) funciona; en SQL*Plus se ubicaría en un aviso . De alguna manera se infiere que debería estar allí, tratando de ser útil. Cuando agregas la update declaración ya no es el final de la secuencia de comandos por lo que no se aplica.

Si agrega una barra a su secuencia de comandos entre el código PL/SQL y la siguiente instrucción SQL, todo funciona:

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

y ahora ves:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled


1 row updated.