Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sự cố về trình kích hoạt PL / SQL

Bạn đã hiển thị mã theo từng đoạn. nhưng có vẻ như bạn đang chạy những gì bạn đã hiển thị cùng nhau dưới dạng tập lệnh, ban đầu không có bản cập nhật:

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;

Khi chạy dưới dạng một tập lệnh trong SQL Developer, cửa sổ xuất tập lệnh hiển thị:

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

Nếu sau đó bạn thêm câu lệnh cập nhật vào tập lệnh:

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

bạn nhận được:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled

Errors: check compiler log

Sau đó, nếu bạn cố gắng tự chạy bản cập nhật (dưới dạng câu lệnh thay vì tập lệnh; hoặc bằng cách chọn thử nghiệm đó và chạy dưới dạng tập lệnh), bạn thực sự nhận được:

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.

Nếu bạn truy vấn user_errors xem hoặc chạy show errors , bạn sẽ thấy:

PLS-00103: Encountered the symbol "UPDATE"

Vấn đề là bạn chưa hoàn thành create trigger tuyên bố đúng. Bản cập nhật update đang được xem như là một phần của cùng một khối PL / SQL; một phần không hợp lệ, nhưng vẫn được bao gồm.

Khi bạn có một khối PL / SQL, bạn phải kết thúc nó bằng một dấu gạch chéo, như nó giải thích trong tài liệu SQL * Plus (cũng áp dụng cho Nhà phát triển SQL):

SQL Developer không phàn nàn nếu khối cuối cùng trong tập lệnh không có dấu gạch chéo kết thúc, vì vậy tập lệnh gốc của bạn (không có bản cập nhật) hoạt động; trong SQL * Plus, nó sẽ được nhắc . Nó cho rằng nó nên có ở đó - cố gắng trở nên hữu ích. Khi bạn thêm update tuyên bố nó không còn là phần cuối của tập lệnh nên điều đó không áp dụng.

Nếu bạn thêm dấu gạch chéo vào tập lệnh của mình giữa mã PL / SQL và câu lệnh SQL sau thì tất cả đều hoạt động:

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

và bây giờ bạn thấy:

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. Cách gọi một hàm với tham số Rowtype từ một câu lệnh select trong Oracle

  2. Xem các giao dịch đang mở trong Oracle

  3. Cách khôi phục cơ sở dữ liệu bằng RMAN

  4. Thay thế văn bản trong một cột BLOB

  5. Kiểm tra ràng buộc trên một loại