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.