sql >> Databáze >  >> RDS >> Oracle

Problémy se spouštěčem PL/SQL

Ukázali jste kód po částech. ale zdá se, že to, co jste ukázali, spouštíte společně jako skript, zpočátku bez aktualizace:

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;

Při spuštění jako skript v SQL Developer okno výstupu skriptu zobrazuje:

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

Pokud poté do skriptu přidáte příkaz aktualizace:

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

dostanete:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled

Errors: check compiler log

Pokud se poté pokusíte spustit aktualizaci samostatně (jako příkaz místo skriptu; nebo výběrem tohoto testu a spuštěním jako skript), skutečně získáte:

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.

Pokud zadáte dotaz na user_errors zobrazit nebo spustit show errors , uvidíte:

PLS-00103: Encountered the symbol "UPDATE"

Problém je v tom, že nedokončujete create trigger prohlášení řádně. update je vnímán jako součást stejného bloku PL/SQL; neplatná část, ale stále zahrnutá.

Když máte blok PL/SQL, musíte jej ukončit lomítkem, jak je vysvětleno v dokumentaci SQL*Plus (což většinou platí i pro SQL Developer):

SQL Developer si nestěžuje, pokud poslední blok ve skriptu nemá ukončovací lomítko, takže váš původní skript (bez aktualizace) funguje; v SQL*Plus by seděl na výzvu . Z toho tak trochu vyplývá, že by tam měl být – snažit se být nápomocný. Když přidáte update prohlášení, že to již není konec skriptu, takže to neplatí.

Pokud do skriptu přidáte lomítko mezi kód PL/SQL a následující příkaz SQL, vše funguje:

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

a teď vidíte:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled


1 row updated.



  1. Sekvence hibernace nebyla vygenerována

  2. Jaký je nejlepší způsob, jak zvládnout připojení SQL na serveru http (Flask) bez ORM v Pythonu?

  3. Použitý typ tabulky nepodporuje FULLTEXTOVÉ indexy

  4. mysql počet řádků za hodinu