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