البرمجة

إدراج سجل في Oracle 11g باستخدام PL/SQL: تجنب الإدراج المكرر في جدول معين

في البداية، يبدو أن هناك بعض الأخطاء في الاستعلام الخاص بك. سأقوم بتوضيح الأخطاء وتقديم تعديلات لجعل الاستعلام يعمل بشكل صحيح.

الأخطاء في الاستعلام الحالي:

  1. في الفقرة الأخيرة من الاستعلام، يوجد استخدام زائد لكلمة “where”. يجب أن تكون “and” بدلاً من “and where”.

  2. الفقرة النهائية تحتوي على فحص not exists مع استخدام note_s.nextval في الجزء الخاص بالاختيار، مما يسبب خطأ. يجب أن يكون لديك فقط الفحص not exists دون استخدام note_s.nextval.

  3. لاحظ أنه يجب تعديل العبارة where cu.course_id = 23846 في الجزء الأخير من الفقرة لتناسب الشرط الذي تريد فحصه.

تحسين الاستعلام:

sql
insert into note (note_id, user_book_id, course_user_id, book_edition_id, book_id, role_type_id, page_id, book_page_number, xcoord, ycoord, width, height, share_across_courses, date_created, date_updated, created_by, updated_by, description, share_with_students, text) select note_s.nextval, i_user_book_id, i_course_user_id, book_edition_id, book_id, n.role_type_id, page_id, book_page_number, xcoord, ycoord, width, height, share_across_courses, sysdate, sysdate, i_user_id, i_user_id, description, share_with_students, text from note n inner join course_user cu on n.course_user_id = cu.course_user_id where cu.course_id = 23846 and not exists ( select 1 from note n2 where n2.course_user_id = cu.course_user_id );

باستخدام هذا الاستعلام المعدل، يجب أن يعمل الإدخال بشكل صحيح وفقًا للمتطلبات التي طلبتها. يتم التحقق من وجود السجل في الجدول note بناءً على course_user_id، وإذا لم يكن موجودًا، يتم إدراجه بواسطة الفقرة الرئيسية.

المزيد من المعلومات

في سياق تنفيذ الاستعلام الذي قمت بتقديمه، يمكن توضيح بعض النقاط الهامة لفهم العملية بشكل أفضل:

  1. استخدام INSERT INTO ... SELECT: تقوم هذه العبارة بإدراج البيانات المستعرضة من الجدول المصدر (note) إلى الجدول الهدف (note). يتم تحديد القيم التي يتم إدراجها في الجدول الهدف من خلال الاستعلام المدمج بين الجدولين.

  2. NOT EXISTS: يتيح لنا هذا الشرط التحقق من عدم وجود سجل محدد في الجدول المستهدف (note) بناءً على الشرط المحدد، وبالتحديد على أساس course_user_id.

  3. note_s.nextval: يتم استخدام هذا لتوليد قيمة جديدة لعمود note_id باستخدام تسلسل note_s. يضمن ذلك أن تكون قيمة note_id فريدة لكل سجل.

  4. sysdate: تستخدم هذه الوظيفة لإدراج التاريخ الحالي عند تنفيذ الإدراج.

  5. الارتباط بين الجداول: يتم ربط الجدولين note و course_user باستخدام الجملة INNER JOIN على أساس course_user_id، وهو الحقل الذي يتم استخدامه للتحقق من الوجود أو عدم الوجود في الجدول المستهدف.

باستخدام هذا الاستعلام، يمكنك ضمان أنه إذا كان هناك سجل موجود في الجدول note مع نفس course_user_id، فلن يتم إدراج سجل جديد، وإلا سيتم إدراج سجل جديد بقيم فريدة وفقًا لتسلسل note_s والقيم المحددة في الجزء الرئيسي من الاستعلام.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر