الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما مشكلة استخدام Commit داخل الاجراءات المخزنه

بدأه العقده في 5 أغسطس 2008 · 2 رد · 917 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

قمت بعمل اجراء مخزن يقوم بصرف ارقام تسلسليه بناءا على تاريخ السنه :

Create Or Replace Function THEID(ID_Year in number) Return Number
is
IDis Number :=0;
Begin
Select nvl(max(id),0) +1 into IDis from id Where IDDATE = ID_Year;

if IDis = 1 then
   insert into ID Values(IDis,ID_Year); 
else
  Update ID Set id = IDis Where IDDATE = ID_Year; 
end if;

Commit;

return (IDis);

end THEID;

ولكن استخدامه بالشكل التالي :

 insert into Mam Values(THEID(1423),'ibrhim','Rihad');

يظهر هذا الــ Error

insert into Mam Values(THEID(1423),'ibrhim','Rihad')
						*

ERROR at line 1: 
ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML 
ORA-06512: at "STOCK1.THEID", line 13

طيب اذا كان الوضع هكذا كيف يتم تثبيت التعديل او التغيير بالنسبه للاجراءا اعلاه .. او ان التعامل مع الاجراءات يتم تثبيتها مباشرتا وقت التنفيذ .

ليس كل ما يتمناه المرء يدركه

arabteam2000.gif

#2

لا يمكنك إجراء Commit داخل Function (بعكس Procedure ) (هناك الكثير من القيود يمكنك الإطلاع عليها في أي كتاب PLSQL ) ..

ببساط أنت تحتاج إلى commit بعد عملية Insert التي قمت بإستدعاء Function منها ، أليس كذلك ؟ هذه Commit ستقوم بتثبيت ما قامت به Function إضافة إلى Insert ..

إذا تحدثت عن مشكلة Constraint فإبحث عن ما يسمى deferrable contraint ( القيود المؤجلة والتي لا يتم التحقق منها إلا عند Commit ) ..

#3

أي Function فيها DML ممكن تنفذها بـ Execute مش بـ Select ..

و اعتقد انها حتضبط معاك .

بالتوفيق ،،

تم تعديل هذه المشاركة بواسطة IGBSpeed في 22 أغسطس 2008 في 20:31

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…