أفضل طريقة لتغليف مجمع Oracle PL/SQL المؤشر المنطق الرأي ؟

StackOverflow https://stackoverflow.com/questions/20081

  •  09-06-2019
  •  | 
  •  

سؤال

لقد كتبت PL/SQL البرمجية denormalize الجدول في الكثير من easer إلى نموذج الاستعلام.رمز يستخدم جدول مؤقت للقيام ببعض أعماله ، ودمج بعض الصفوف من الجدول الأصلي معا.

المنطق هو كما هو مكتوب عبر خط انابيب الجدول وظيفة, في أعقاب نمط من ربط المادة.الجدول وظيفة يستخدم PRAGMA AUTONOMOUS_TRANSACTION إعلان إلى تصريح الجدول المؤقت التلاعب و أيضا يقبل المؤشر معلمة الإدخال إلى تقييد denormalization إلى بعض قيم معرف.

ثم خلق طريقة عرض الاستعلام عن الجدول وظيفة ، ويمر في كل ما يمكن معرف القيم المؤشر (الاستخدامات الأخرى الدالة سوف تكون أكثر تقييدا).

سؤالي:كل هذا ضروري حقا ؟ لقد غاب تماما أكثر من ذلك بكثير بسيطة طريقة لإنجاز نفس الشيء ؟

في كل مرة كنت على اتصال PL/SQL لدي انطباع أن أكتب كثيرا.

تحديث: سأضيف رسم الجدول أنا أتعامل مع لإعطاء الجميع فكرة عن denormalization أن أتحدث عنه.الجدول مخازن تاريخ من الموظف الوظائف ، مع كل التفعيل التوالي ، و (ربما) إنهاء الصف.من الممكن للموظف أن يكون المتزامنة متعددة الوظائف ، وكذلك نفس المهمة مرارا وتكرارا في غير متجاورة نطاقات التاريخ.على سبيل المثال:

| EMP_ID | JOB_ID | STATUS | EFF_DATE    | other columns...
|      1 |     10 | A      | 10-JAN-2008 |
|      2 |     11 | A      | 13-JAN-2008 |
|      1 |     12 | A      | 20-JAN-2008 |
|      2 |     11 | T      | 01-FEB-2008 |
|      1 |     10 | T      | 02-FEB-2008 |
|      2 |     11 | A      | 20-FEB-2008 |

الاستعلام عن ذلك إلى معرفة من هو العامل عندما تكون في أي وظيفة هو غير تافهة.حتى denormalization وظيفة بملء الجدول المؤقت فقط مع تاريخ نطاقات لكل وظيفة ، أي EMP_IDs مرت في على الرغم من المؤشر.ويمر في EMP_IDs 1 و 2 سوف تنتج التالية:

| EMP_ID | JOB_ID | START_DATE  | END_DATE    |
|      1 |     10 | 10-JAN-2008 | 02-FEB-2008 |
|      2 |     11 | 13-JAN-2008 | 01-FEB-2008 |
|      1 |     12 | 20-JAN-2008 |             |
|      2 |     11 | 20-FEB-2008 |             |

(END_DATE يسمح NULLs للحصول على فرص العمل التي لا يكون لها سلفا تاريخ الإنهاء.)

كما يمكنك أن تتخيل, هذا denormalized شكل هو أسهل بكثير الاستعلام ، ولكن خلق ذلك-بقدر ما أستطيع أن أقول--يتطلب جدول مؤقت لتخزين نتائج المتوسطة (على سبيل المثال ، عمل السجلات التي التنشيط الصف وقد وجد ، ولكن ليس إنهاء...بعد).باستخدام خط انابيب الجدول وظيفة لملء الجدول المؤقت ثم العودة الصفوف هو الطريق الوحيد لقد برزت كيفية القيام بذلك.

هل كانت مفيدة؟

المحلول

أعتقد أن طريقة لمعالجة هذا هو استخدام الوظائف التحليليه...

انا إعداد اختبار الحالة باستخدام:

create table employee_job (
    emp_id integer,
    job_id integer,
    status varchar2(1 char),
    eff_date date
    );  

insert into employee_job values (1,10,'A',to_date('10-JAN-2008','DD-MON-YYYY'));
insert into employee_job values (2,11,'A',to_date('13-JAN-2008','DD-MON-YYYY'));
insert into employee_job values (1,12,'A',to_date('20-JAN-2008','DD-MON-YYYY'));
insert into employee_job values (2,11,'T',to_date('01-FEB-2008','DD-MON-YYYY'));
insert into employee_job values (1,10,'T',to_date('02-FEB-2008','DD-MON-YYYY'));
insert into employee_job values (2,11,'A',to_date('20-FEB-2008','DD-MON-YYYY'));

commit;

لقد استعملت يؤدي وظيفة للحصول على الموعد القادم ثم يلف كل ذلك الفرعية الاستعلام فقط للحصول على "A" سجلات إضافة تاريخ النهاية إذا كان هناك واحد.

select
    emp_id,
    job_id,
    eff_date start_date,
    decode(next_status,'T',next_eff_date,null) end_date
from
    (
    select
        emp_id,
        job_id,
        eff_date,
        status,
        lead(eff_date,1,null) over (partition by emp_id, job_id order by eff_date, status) next_eff_date,
        lead(status,1,null) over (partition by emp_id, job_id order by eff_date, status) next_status
    from
        employee_job
    )
where
    status = 'A'
order by
    start_date,
    emp_id,
    job_id

أنا متأكد من أن هناك بعض الحالات استخدام اشتقت ولكن تحصل على هذه الفكرة.الدوال التحليلية هي صديقك :)

EMP_ID   JOB_ID     START_DATE     END_DATE            
  1        10       10-JAN-2008    02-FEB-2008         
  2        11       13-JAN-2008    01-FEB-2008         
  2        11       20-FEB-2008                              
  1        12       20-JAN-2008                              

نصائح أخرى

بدلا من وجود معلمة الإدخال باعتباره المؤشر لكنت متغير جدول (لا أعرف إذا كان أوراكل لديه شيء من هذا القبيل أنا tsql ضمن الرجل) أو نشر أخرى درجة الحرارة الجدول مع الهوية والقيم الانضمام على ذلك في رأي/وظيفة أو أينما كنت في حاجة إليها.

المرة الوحيدة على المؤشرات في رأيي صادقة عندما لديك حلقة.و عندما يكون لديك حلقة أوصي دائما أن تفعل ذلك خارج قاعدة البيانات في تطبيق المنطق.

يبدو أنك التخلي عن بعض قراءة الاتساق هنا أي:سيكون من الممكن بالنسبة محتويات الجدول المؤقت أن تكون متزامنة مع مصدر البيانات إذا كان لديك المتزامنة تعديل تعديل البيانات.

دون معرفة المتطلبات ، ولا تعقيد ما تريد تحقيقه.وأود أن محاولة

  1. لتحديد طريقة عرض التي تحتوي على (ربما معقدة) المنطق في SQL, آخر أود إضافة بعض PL/SQL إلى المزيج مع ؛
  2. مسارات النقل الجدول وظيفة ، ولكن باستخدام SQL جمع نوع (بدلا من الجدول المؤقت ).مثال بسيط هنا: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4447489221109

عدد 2 سوف تعطيك أقل من الأجزاء المتحركة و حل الاتساق المسألة.

ماثيو بتلر

المشكلة الحقيقية هنا هي "الكتابة فقط" تصميم الجدول - الذي يعني انه من السهل إدخال البيانات في ذلك ، ولكن صعبة و غير فعالة في الحصول على معلومات مفيدة من ذلك!الخاص بك "مؤقتة" الجدول هيكل "دائم" الجدول ينبغي أن يكون في المقام الأول.

أيمكنك فعل هذا:

  • إنشاء جدول دائمة مع أفضل هيكل
  • ملء مع البيانات في الجدول الأول
  • تعريف قاعدة البيانات الزناد على الجدول الأصلي للحفاظ على الجدول الجديد في المزامنة من الآن فصاعدا

ثم يمكنك فقط اختيار من الجدول الجديد لأداء التقارير الخاصة بك.

لم أستطع أن أتفق معك أكثر من ذلك ، HollyStyles.أود أيضا أن تستخدم ليكون tsql ضمن الرجل و تجد بعض من أوراكل الخصوصيات أكثر من القليل من الحيرة.للأسف temp الجداول ليست مريحة في أوراكل ، و في هذه الحالة القائمة الأخرى SQL المنطق يتوقع أن الاستعلام مباشرة الطاولة حتى أعطيها هذا الرأي بدلا من ذلك.هناك حقا أي تطبيق المنطق موجود خارج قاعدة البيانات في هذا النظام.

أوراكل المطورين يبدو أن استخدام المؤشرات أكثر بفارغ الصبر مما كنت أعتقد.نظرا عبودية & الانضباط طبيعة PL/SQL, هذا كل ما يثير الدهشة أكثر.

أبسط حل هو:

  1. إنشاء العالمية جدول مؤقت التي تحتوي على مجرد معرفات تحتاج:

    CREATE GLOBAL TEMPORARY TABLE tab_ids (id INTEGER)  
    ON COMMIT DELETE ROWS;
    
  2. ملء الجدول المؤقت مع معرفات التي تحتاج إليها.

  3. استخدام موجود العملية في الإجراء الخاص بك لتحديد الصفوف التي يتم إلا في معرفات الجدول:

      SELECT yt.col1, yt.col2 FROM your\_table yt  
       WHERE EXISTS (  
          SELECT 'X' FROM tab_ids ti  
           WHERE ti.id = yt.id  
       )
    

يمكنك أيضا تمرير مفصولة بفواصل سلسلة من معرفات بوصفها وظيفة معلمة وتحليل ذلك في جدول.هذا هو يؤديها واحد حدد.تريد أن تعرف المزيد - تسألني كيف :-) ولكن يجب أن يكون سؤال منفصل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top