Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

पीएल/एसक्यूएल ट्रिगर मुद्दे

आपने कोड को टुकड़ों में दिखाया है। लेकिन ऐसा लगता है कि आप वही चला रहे हैं जो आपने स्क्रिप्ट के रूप में एक साथ दिखाया है, शुरुआत में बिना अपडेट के:

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;

SQL डेवलपर में स्क्रिप्ट के रूप में चलाने पर स्क्रिप्ट आउटपुट विंडो दिखाती है:

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

अगर आप स्क्रिप्ट में अपडेट स्टेटमेंट जोड़ते हैं:

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

आपको मिलता है:

Table SALUPDATES dropped.


Table SALUPDATES created.


Trigger T1 compiled

Errors: check compiler log

यदि आप अद्यतन को स्वयं चलाने का प्रयास करते हैं (एक स्क्रिप्ट के बजाय एक बयान के रूप में; या उस परीक्षण का चयन करके और एक स्क्रिप्ट के रूप में चल रहा है) तो आपको वास्तव में मिलता है:

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.

अगर आप user_errors के बारे में पूछते हैं देखें, या चलाएं show errors , आप देखेंगे:

PLS-00103: Encountered the symbol "UPDATE"

समस्या यह है कि आप create trigger . को पूरा नहीं कर रहे हैं कथन ठीक से। update उसी पीएल/एसक्यूएल ब्लॉक के हिस्से के रूप में देखा जा रहा है; एक अमान्य हिस्सा, लेकिन फिर भी शामिल है।

जब आपके पास PL/SQL ब्लॉक होता है, तो आपको इसे एक स्लैश के साथ समाप्त करना होता है, जैसा कि SQL*प्लस दस्तावेज़ में बताया गया है (जो ज्यादातर SQL डेवलपर पर भी लागू होता है):

एसक्यूएल डेवलपर शिकायत नहीं करता है अगर किसी स्क्रिप्ट में अंतिम ब्लॉक में समाप्ति स्लैश नहीं है, तो आपकी मूल स्क्रिप्ट (अपडेट के बिना) काम करती है; एसक्यूएल में*प्लस यह एक प्रॉम्प्ट पर बैठेगा . यह इस तरह का अनुमान लगाता है कि यह होना चाहिए - मददगार बनने की कोशिश करना। जब आप update जोड़ते हैं कथन यह अब स्क्रिप्ट का अंत नहीं है इसलिए यह लागू नहीं होता है।

यदि आप अपनी स्क्रिप्ट में PL/SQL कोड और निम्न SQL कथन के बीच एक स्लैश जोड़ते हैं तो यह सब काम करता है:

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

और अब आप देखते हैं:

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. Oracle एपेक्स 20.2 में Sql स्क्रिप्ट फ़ाइल (apex_epg_config.sql) गायब है

  2. समानांतर कथन में dml त्रुटि लॉगिंग को क्यों अनदेखा किया गया?

  3. फास्ट स्प्लिट विभाजन

  4. Oracle डेटाबेस से SQL का उपयोग करके XML क्लॉब से डेटा निकालें

  5. त्रुटि (2,7):PLS-00428:इस चयन कथन में एक INTO खंड अपेक्षित है