أفضل طريقة لتغليف مجمع Oracle PL/SQL المؤشر المنطق الرأي ؟
سؤال
لقد كتبت 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_ID
s مرت في على الرغم من المؤشر.ويمر في EMP_ID
s 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
يسمح NULL
s للحصول على فرص العمل التي لا يكون لها سلفا تاريخ الإنهاء.)
كما يمكنك أن تتخيل, هذا 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 ضمن الرجل) أو نشر أخرى درجة الحرارة الجدول مع الهوية والقيم الانضمام على ذلك في رأي/وظيفة أو أينما كنت في حاجة إليها.
المرة الوحيدة على المؤشرات في رأيي صادقة عندما لديك حلقة.و عندما يكون لديك حلقة أوصي دائما أن تفعل ذلك خارج قاعدة البيانات في تطبيق المنطق.
يبدو أنك التخلي عن بعض قراءة الاتساق هنا أي:سيكون من الممكن بالنسبة محتويات الجدول المؤقت أن تكون متزامنة مع مصدر البيانات إذا كان لديك المتزامنة تعديل تعديل البيانات.
دون معرفة المتطلبات ، ولا تعقيد ما تريد تحقيقه.وأود أن محاولة
- لتحديد طريقة عرض التي تحتوي على (ربما معقدة) المنطق في SQL, آخر أود إضافة بعض PL/SQL إلى المزيج مع ؛
- مسارات النقل الجدول وظيفة ، ولكن باستخدام SQL جمع نوع (بدلا من الجدول المؤقت ).مثال بسيط هنا: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4447489221109
عدد 2 سوف تعطيك أقل من الأجزاء المتحركة و حل الاتساق المسألة.
ماثيو بتلر
المشكلة الحقيقية هنا هي "الكتابة فقط" تصميم الجدول - الذي يعني انه من السهل إدخال البيانات في ذلك ، ولكن صعبة و غير فعالة في الحصول على معلومات مفيدة من ذلك!الخاص بك "مؤقتة" الجدول هيكل "دائم" الجدول ينبغي أن يكون في المقام الأول.
أيمكنك فعل هذا:
- إنشاء جدول دائمة مع أفضل هيكل
- ملء مع البيانات في الجدول الأول
- تعريف قاعدة البيانات الزناد على الجدول الأصلي للحفاظ على الجدول الجديد في المزامنة من الآن فصاعدا
ثم يمكنك فقط اختيار من الجدول الجديد لأداء التقارير الخاصة بك.
لم أستطع أن أتفق معك أكثر من ذلك ، HollyStyles.أود أيضا أن تستخدم ليكون tsql ضمن الرجل و تجد بعض من أوراكل الخصوصيات أكثر من القليل من الحيرة.للأسف temp الجداول ليست مريحة في أوراكل ، و في هذه الحالة القائمة الأخرى SQL المنطق يتوقع أن الاستعلام مباشرة الطاولة حتى أعطيها هذا الرأي بدلا من ذلك.هناك حقا أي تطبيق المنطق موجود خارج قاعدة البيانات في هذا النظام.
أوراكل المطورين يبدو أن استخدام المؤشرات أكثر بفارغ الصبر مما كنت أعتقد.نظرا عبودية & الانضباط طبيعة PL/SQL, هذا كل ما يثير الدهشة أكثر.
أبسط حل هو:
إنشاء العالمية جدول مؤقت التي تحتوي على مجرد معرفات تحتاج:
CREATE GLOBAL TEMPORARY TABLE tab_ids (id INTEGER) ON COMMIT DELETE ROWS;
ملء الجدول المؤقت مع معرفات التي تحتاج إليها.
استخدام موجود العملية في الإجراء الخاص بك لتحديد الصفوف التي يتم إلا في معرفات الجدول:
SELECT yt.col1, yt.col2 FROM your\_table yt WHERE EXISTS ( SELECT 'X' FROM tab_ids ti WHERE ti.id = yt.id )
يمكنك أيضا تمرير مفصولة بفواصل سلسلة من معرفات بوصفها وظيفة معلمة وتحليل ذلك في جدول.هذا هو يؤديها واحد حدد.تريد أن تعرف المزيد - تسألني كيف :-) ولكن يجب أن يكون سؤال منفصل.