Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Masalah Pemicu PL/SQL

Anda telah menunjukkan kode dalam potongan. tetapi tampaknya Anda menjalankan apa yang telah Anda tampilkan bersama sebagai skrip, awalnya tanpa pembaruan:

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;

Saat dijalankan sebagai skrip di SQL Developer, jendela keluaran skrip menunjukkan:

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

Jika Anda kemudian menambahkan pernyataan pembaruan ke skrip:

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

Anda mendapatkan:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled

Errors: check compiler log

Jika Anda kemudian mencoba menjalankan pembaruan itu sendiri (sebagai pernyataan alih-alih skrip; atau dengan memilih tes itu dan menjalankannya sebagai skrip), Anda memang mendapatkan:

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.

Jika Anda menanyakan user_errors lihat, atau jalankan show errors , Anda akan melihat:

PLS-00103: Encountered the symbol "UPDATE"

Masalahnya adalah Anda tidak menyelesaikan create trigger pernyataan dengan benar. update sedang dilihat sebagai bagian dari blok PL/SQL yang sama; bagian yang tidak valid, tetapi masih disertakan.

Saat Anda memiliki blok PL/SQL, Anda harus menghentikannya dengan garis miring, seperti yang dijelaskan dalam dokumentasi SQL*Plus (yang sebagian besar juga berlaku untuk Pengembang SQL):

Pengembang SQL tidak mengeluh jika blok terakhir dalam skrip tidak memiliki garis miring, jadi skrip asli Anda (tanpa pembaruan) berfungsi; di SQL*Plus itu akan duduk di prompt . Ini semacam menyimpulkan bahwa itu harus ada - mencoba membantu. Saat Anda menambahkan update pernyataan itu bukan lagi akhir dari skrip sehingga tidak berlaku.

Jika Anda menambahkan garis miring ke skrip Anda antara kode PL/SQL dan pernyataan SQL berikut, semuanya berfungsi:

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

dan sekarang Anda melihat:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled


1 row updated.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menambahkan klausa where ke entitas tabel gabung eksplisit Hibernate @OneToMany?

  2. Oracle Tunggu Acara Yang Harus Diketahui Semua Orang

  3. Pisahkan String dengan baris baru dan tambahkan array di PL sql Oracle

  4. Cara mengetahui ukuran pengambilan optimal untuk kueri pemilihan

  5. Bagaimana cara menjalankan prosedur lokal menggunakan eksekusi segera?