إذا كنت تواجه مشكلة مع القواعد البرمجية في PL/SQL، يبدو أن الأخطاء التي تحصل عليها تظهر بسبب أخطاء صغيرة في النص الذي كتبته. هنا بعض النقاط التي يجب مراجعتها:
-
beign في السطر رقم 4: الكلمة الصحيحة هي
begin
بدلاً منbeign
. -
=: في السطر رقم 6: يجب أن يكون
=
بدلاً من=:
.
بعد تصحيح هذه الأخطاء، قد تكون القاعدة البرمجية جاهزة للعمل. إليك الكود بعد التعديل:
sqlcreate or replace trigger t2 before insert or update on programmer for each row
declare
cursor c1 is select prof1, prof2 from programmer;
begin
for r1 in c1 loop
if r1.pname = :new.pname then
if :new.prof1 = :new.prof2 then
raise_application_error(-20091,'prof1 and prof2 should not be same');
end if;
end if;
end loop;
end;
/
يرجى ملاحظة أنه يجب أن تكون متأكدًا من أن هذا هو السلوك الذي تريده من القاعدة البرمجية، حيث أنها ستتحقق من كل صف جديد قبل إدخاله أو تحديثه وسترفض الإجراء إذا كانت prof1 تساوي prof2 لنفس الاسم pname.
المزيد من المعلومات
يبدو أن الأخطاء التي تظهر تنتج عن بعض الأخطاء الإملائية والتركيبية في الكود. هناك بعض الأمور التي يمكن تحسينها في الكود:
- في السطر 4، يجب أن تكون الكلمة الصحيحة “begin” بدلاً من “beign”.
- في السطر 6، يجب إزالة الفراغ بين “:” و”new”، لتصبح الجملة “if :new.pname then”.
- في السطر 7، يجب إزالة الفراغ بين “:” و”new”، لتصبح الجملة “if :new.prof1 = :new.prof2 then”.
بعد إجراء هذه التعديلات، يجب أن يكون الكود قابل للتنفيذ بدون أخطاء. إليك الكود المعدل:
sqlcreate or replace trigger t2 before insert or update on programmer for each row
declare
cursor c1 is select prof1, prof2 from programmer;
begin
for r1 in c1 loop
if r1.pname = :new.pname then
if :new.prof1 = :new.prof2 then
raise_application_error(-20091, 'prof1 and prof2 should not be same');
end if;
end if;
end loop;
end;
/
يرجى تجربة هذا الكود المعدل وإعلامي إذا كان هناك أي مشكلة أخرى تحدث.