2/11/2013

Multitable INSERT Statements

السلام عليكم
Multitable INSERT Statements

ما هو Multitable INSERT Statements ؟
هو يمكنك من  ادخال عده قيم فى اكتر من جدول فى وقت واحد
هو مناسب جدا لـ انظمه المستودعات -warehousind- حيث يمكنك من نقل البيانات الناتجه عن اكثر من عمليه لوضعها فى جدول معين.
وهو اداه سريعه جدا مقارنه بـ استخدام جمل Single DML اوجمل IF فى عمليات INSERT
توجد عده انواع لـ Multitable INSERT Statements
Unconditional INSERT
Conditional ALL INSERT
Conditional FIRST INSERT
Pivoting INSERT
General Code
INSERT [ALL] [conditional_insert_clause]
[insert_into_clause value_clause] (subquery)
# conditional_insert_clause
[ALL] [FIRST]
[WHEN conditional THEN] [insert_into_clause values_clause]
[ELSE] [insert_into_clause values_clause]

Unconditional INSERT ALL

هى خاصيه تمكنك من ادخال عده قيم فى اكثر من جدول فى نفس الوقت بدون اى شروط..فى المثال التالى اريد ان اضيف بعض الصفوف فى جدولين (SAL_HISTORY and MGR_HISTORY) وستتم اضافه القيم بأستخدام الـ subquery 

صوره رقم(1)


Code
INSERT ALL
  INTO SAL_HISTORY VALUES (EMPID,HIREDATE,SAL)
  INTO MGR_HISTORY VALUES (EMPID,MGR,SAL)
SELECT EMPLOYEE_ID EMPID 
      ,HIRE_DATE   HIREDATE
      ,SALARY      SAL
      ,MANAGER_ID  MGR
FROM  EMPLOYEES
WHERE EMPLOYEE_ID > 200;
Conditional INSERT ALL

هى خاصيه تمكنك من اضافه عده اعمده فى عده جدوال فى نفس الوقت بناء على شرط معين .
مثال توضيحى :
فى المثالى التالى قمت بأستعلام عن مجموعه اعمده من جدول EMPLOYEES فى حاله كان الراتب اكبر من 10000 اذن ادخل القيم فى جدول SAL_HISTORY .-الحاله الأولى-
فى حاله كان رقم مدير القسم اكبر من 200 اذن ادخل القيم فى جدول MGR_HISTORY.-الحاله الثانيه-
والحالتين غير مرتبطين ببعض . الـ Conditional INSERT هو اشبه بـ IF Statements فى حاله كذا افعل كذا وفى حاله كذا افعل كذا مع العلم ان Conditional INSERT اداءاه فى عمليات الـ INSERT اسرع بكثير من استخدام جمل IF.
صوره رقم(2)

Code
INSERT ALL
  WHEN SAL > 10000 THEN
   INTO SAL_HISTORY VALUES (EMPID,HIREDATE,SAL) 
  WHEN MGR > 200   THEN
   INTO MGR_HISTORY VALUES (EMPID,MGR,SAL)
SELECT EMPLOYEE_ID EMPID
      ,HIRE_DATE   HIREDATE
      ,MANAGER_ID  MGR
      ,SALARY      SAL
FROM  EMPLOYEES
WHERE EMPLOYEE_ID > 200;

Conditional INSERT FIRST

تمكنك هذه الـ function من ادخال عده قيم فى عده جداول فى نفس الوقت بناء على شرط معين... ولكن فى حاله تحقق الشرط فى الحاله الاولى لا يتم التحقق من باقى الحالات واذا كانت الحاله الاولى غير مطابقه للشرط فيتم التحقق من الحاله الثانيه واذا اوفت الشروط يتم تحقيقها ولا يتم التحقق من الحاله الثالثه وهكذا.
ومن خلال المثال التالى ان شاء الله سيتضح الأمر اكثر
 فى المثال التالى اريد ان استعلم عن مجموعه اعمده فى جدول الـ employees فى حاله كان مجموع الراتب-(SUM(salary- اكبر من 25,000 فى هذه الحاله اضف هذه القيم فى جدول SPECIAL_SAL بأستخدام FIRST multitable INSERT وعند استخدامك لـ هذه الـ function فهى تقوم بتنفيذ الأمر كلتالى اذا تحقق الشرط قم بادخال القيم فى الجدول ولا تنظر الى باقى الشروط الموجوده فى حاله لم يتحقق الشرط فـ انظر لباقى الشروط الموجوده ومن يحقق الشرط منهم نفذ له ما يريد واذا كانو جميعهم لا يحققون الشرط فـ نفذ ما بعد ELSE.

صوره رقم(3)



Code
INSERT FIRST
  WHEN SAL > 25000 THEN
   INTO SPECIAL_SAL VALUES (DEPTID,SAL)
  WHEN HIREDATE LIKE ('%') THEN
   INTO HIREDATE_HISTORY_00 VALUES (DEPTID , HIREDATE)
  WHEN HIREDATE LIKE ('%99%') THEN
   INTO HIREDATE_HISTORY_99 VALUES (DEPTID , HIREDATE)
 ELSE
  INTO HIREDATE_HISTORY VALUES (DEPTID,HIREDATE)
SELECT DEPARTMENT_ID DEPTID 
      ,SUM(SALARY)   SAL
      ,MAX(HIRE_DATE)HIREDATE
FROM  EMPLOYEES
GROUP BY DEPARTMENT_ID;

 Pivoting INSERT 
هى function تمكنك من تحويل القيم الموجوده فى الأعمده الى الصفوف
دعونا نتطرق اكثر فى الشرح من خلال مثال ...
فى المثال التالى لدينا جدول بأسم sales_source_data

CREATE TABLE SALES_SOURCE_DATA
( EMPLOYEE_ID     NUMBER(6)
 ,WEEK_ID         NUMBER(2)
 ,SALES_MON       NUMBER(8,2)
 ,SALES_TUE       NUMBER(8,2)
 ,SALES_WED       NUMBER(8,2)
 ,SALES_THU       NUMBER(8,2)
 ,SALES_FRI       NUMBER(8,2)
);

table SALES_SOURCE_DATA created.

INSERT INTO SALES_SOURCE_DATA (EMPLOYEE_ID,WEEK_ID,SALES_MON,SALES_TUE,SALES_WED,SALES_THU,SALES_FRI) 
VALUES (176,6,2000,3000,4000,5000,6000);

COMMIT;
SELECT * FROM SALES_SOURCE_DATA;
EMPLOYEE_ID WEEK_ID SALES_MON SALES_TUE SALES_WED SALES_THU SALES_FRI
----------- ------- --------- --------- --------- --------- ---------
        176       6      2000      3000      4000      5000      6000 

عندى جدول أخر بأسم  sales_info 

CREATE TABLE SALES_INFO
(EMPLOYEE_ID    NUMBER(6)
,WEEK           NUMBER(2)
,SALES          NUMBER(8,2)
);
table SALES_INFO created.

 اريد بأستخدام Pivoting INSERT تحويل الأعمده الموجوده فى sales_source_data الى صفوف فى sales_info 
INSERT ALL
INTO sales_info VALUES (employee_id,week_id,sales_MON)
INTO sales_info VALUES (employee_id,week_id,sales_TUE)
INTO sales_info VALUES (employee_id,week_id,sales_WED)
INTO sales_info VALUES (employee_id,week_id,sales_THU)
INTO sales_info VALUES (employee_id,week_id, sales_FRI)
SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE,
SALES_WED, SALES_THU,SALES_FRI
FROM sales_source_data;
5 rows inserted.
SELECT * FROM sales_info;
EMPLOYEE_ID WEEK    SALES
----------- ---- --------
        176    6     2000 
        176    6     3000 
        176    6     4000 
        176    6     5000 
        176    6     6000 

No comments:

Post a Comment