محتويات الدورة

قاعدة بيانات أوراكل / الأساسي: أسس العلاقات والمعاملات / الدرس 3

الشروط والتواريخ والنتائج الحتمية

حوّل سؤال الشحن إلى مجموعة صفوف مستقرة بحدود ذات أنواع واضحة ومعالجة صريحة لـNULL.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • استخدم المنطق ثلاثي القيم والنطاقات الزمنية نصف المفتوحة.
  • اختر ترتيباً حتمياً ومعلمات ربط آمنة.

اكتب عقد النتيجة أولاً

يحدد التقرير المفيد أهلية الصفوف والأعمدة والترتيب كلّاً على حدة. عبارة «الشحنات الحديثة» ناقصة ما لم تحدد الأعمال المنطقة الزمنية وحد التاريخ ومعالجة غير المرسلة ومفتاح فض التعادل. لا يضمن SQL دون ORDER BY ترتيب الإدراج حتى إن بدا مثال صغير ثابتاً. ويغيّر SELECT * مخرجاته عند إضافة عمود. استخدم أعمدة مسماة لعقد تطبيق مستقر وراجع ملاءمة كل حقل للاستجابة. تبدأ الصحة بهذا السؤال قبل اختيار الفهرس أو حد الصفوف.

القيم المجهولة لا تحقق المساواة

تنتج المقارنة مع NULL قيمة مجهولة؛ لذلك لا يختار dispatched_at = NULL الشحنات غير المرسلة. يسأل IS NULL السؤال الصحيح. كما يكون NOT IN خطراً إذا احتوت مجموعة المقارنة NULL؛ فقد يصبح غير العضو ظاهرياً مجهولاً ويختفي. فضّل NOT EXISTS المترابط عندما تسأل الأعمال عن غياب ابن مطابق. وللأقواس أهمية عند الجمع بين AND وOR؛ اكتب التجميع المقروء بدلاً من الاتكال على تذكّر الأولوية. اختبر قيمة غائبة واحدة على الأقل لكل قاعدة تقبل NULL.

sql مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
SELECT CASE WHEN NULL = NULL THEN 'equal' ELSE 'not true' END AS comparison,
       CASE WHEN NULL IS NULL THEN 'missing' ELSE 'present' END AS absence
FROM dual;
الناتج المتوقع
COMPARISON | ABSENCE
not true   | missing

يختار CASE فرع THEN للصحيح فقط؛ المقارنة الأولى مجهولة وIS NULL صحيح.

اليوم نطاق وليس سلسلة منسقة

بالنسبة إلى عمود DATE الذي يخزّن الوقت التشغيلي المحلي، يُعبَّر عن اليوم بوقت يبدأ عند منتصف الليل وينتهي قبيل منتصف الليل التالي. يشمل BETWEEN الطرفين، ولذلك يُدخل منتصف ليل الغد من اليوم التالي خطأ. ويمزج TO_CHAR على العمود بين العرض والتصفية وقد يعيق فهرساً عادياً مفيداً. تتجنب القيم الحرفية DATE التحليل المعتمد على الجلسة. ولأحداث ذات مناطق زمنية اتفق على منطقة العمل وأنشئ حدود لحظات ذات أنواع صحيحة؛ فقد تختلف إضافة يوم تقويمي عن أربع وعشرين ساعة عند تغيّر التوقيت الصيفي.

sql مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
SELECT shipment_id, booked_at
FROM shipments
WHERE booked_at >= DATE '2026-10-01'
  AND booked_at <  DATE '2026-10-02'
ORDER BY booked_at, shipment_id;

يفترض أن booked_at من نوع DATE وفق الساعة التشغيلية الموثقة. تدخل كل أوقات 1 أكتوبر ولا يدخل منتصف ليل 2 أكتوبر.

اجعل الصف الأخير قابلاً لإعادة الإنتاج

يترك ORDER BY booked_at وحده الطوابع المتساوية دون ترتيب محدد. أضف shipment_id الفريد قبل FETCH FIRST 20 ROWS ONLY المتاح من 12c. يضع الترتيب التصاعدي في أوراكل NULL أخيراً عادة، والتنازلي أولاً؛ ويزيل NULLS LAST أو NULLS FIRST الصريح الالتباس. قد تتزحزح صفحات OFFSET مع الإدراج المتزامن ويزداد العمل المطلوب. قد يكون مفتاح متابعة مبني على آخر وقت ومعرّف فريد أكثر استقراراً، لكن مقارنته يجب أن تطابق اتجاه الفرز وسياسة القيم الغائبة تماماً.

اربط القيم وحدّد الصياغة المسموحة

ينبغي أن تمر قيم التطبيق عبر متغيرات الربط في الموصل لا عبر دمج السلاسل. يمثل الربط قيمة، لا اسم جدول أو تعبير ORDER BY اعتباطياً أو شرط SQL كاملاً. اختر المعرّفات واتجاهات الفرز من قائمة تطبيق مسموحة صغيرة. طابق أنواع الأرقام والوقت المرتبطة مع الأعمدة لتجنب التحويلات الضمنية والخطط غير المتسقة. عند توثيق إخفاق احتفظ بهيكل SQL وأنواع المعلمات المحجوبة مع الرسالة؛ فاستبدال كل معلمة بسلسلة مقتبسة قد يخفي عيب التحويل الحقيقي في التطبيق.

الأخطاء الشائعة وإصلاحها

ORA-01861

لماذا يحدث؟
تُحلّل سلسلة ضمنياً بتنسيق تاريخ لا يطابق محتواها.
كيف تصلحه؟
استخدم ربطاً ذا نوع أو DATE حرفياً أو تنسيق تحويل صريحاً يناسب المصدر.
كيف تتجنب تكراره؟
لا تعتمد تنسيق عرض الجلسة بروتوكولاً للإدخال.

لا يعيد استعلام NOT IN صفوفاً على غير المتوقع

لماذا يحدث؟
تحتوي مجموعة المقارنة NULL فتنتج مقارنات مجهولة.
كيف تصلحه؟
استخدم علاقة NOT EXISTS المطلوبة أو برّر استبعاد NULL صراحة.
كيف تتجنب تكراره؟
أدرج ابناً ذا قيمة NULL في بيانات اختبار منطق الاستبعاد.

تكرر الصفحات شحنات أو تسقطها

لماذا يحدث؟
يفتقر الترتيب إلى فاصل تعادل فريد أو تزحزح التغييرات المتزامنة الإزاحات.
كيف تصلحه؟
حدّد ترتيباً كلياً وعقد متابعة للبيانات المتغيرة.
كيف تتجنب تكراره؟
راجع حالات التعادل والإدراج بين طلبات الصفحات.

اختبر فهمك

1. لماذا لا يصف BETWEEN DATE '2026-10-01' AND DATE '2026-10-02' يوم 1 أكتوبر بدقة؟

اعرض الحل المشروح

لأن BETWEEN يشمل منتصف ليل 2 أكتوبر أيضاً. استخدم >= لمنتصف الليل الأول و< للثاني لعمود DATE وفق اصطلاح الساعة المحدد. إذا كان المصدر يخزّن لحظات، اشتق الحدود أولاً في منطقة العمل المتفق عليها بدلاً من افتراض صحة منطقة الخادم.

2. هل يمكن أن يستبدل :sort_column معرّف ORDER BY بأمان؟

اعرض الحل المشروح

لا؛ تمثل متغيرات الربط قيماً. اربط اختيار الفرز الظاهر للمستخدم بتعبير عمود واتجاه تمت مراجعتهما، ثم اربط قيم التصفية فقط. أضف مفتاحاً فريداً ثابتاً للترتيب الناتج، وارفض خيارات الفرز المجهولة بدلاً من دمج نصها في SQL.

أهم ما تعلمته

  • تفسير التاريخ ومنطق NULL والترتيب أجزاء من صحة النتيجة.
  • يؤمّن الربط ذو النوع القيم، وتضبط القائمة المسموحة بنية SQL.

المراجع الرسمية