إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

الref Cursor And Merg


4 رد (ردود) على هذا الموضوع

#1 the past

the past

    عضو مميز

  • الأعضــاء
  • 951 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 16 November 2007 - 05:15 PM

يا شباب اريد شرح ل ref cursor وايضا merg ومالفائدة منهما مع مثال يوضح ذلك






ارجوووووووو الرد

#2 ammar_kh1982

ammar_kh1982

    مشترك

  • الأعضــاء
  • 80 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 16 November 2007 - 08:59 PM

Salamo 3alaikom,



for the ref cursor, you can use it if you want to return a set of data to an application. Like if you are using .Net framwork, and you have a page which needs to view the table of all employees. Then you must return a Ref cursor with all data needed to this application by creating a database procedure like this:



create or replace procedure get_emp_data(p_out ref cursor,p_dept_no number) 

is

begin

open p_out for

select a.emp_id,a.emp_no,a.emp_name,a.sal,b.dept_name

from   emp a,dept b

where b.dept_id = p_dept_no

and	 a.dept_id = b.dept_id;

end;



Good luck.



Abo '7waireh


#3 hanyfreedom

hanyfreedom

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,481 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:Chess , Sudoku

تاريخ المشاركة 18 November 2007 - 01:49 AM

REF CURSOR


DECLARE
TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE;
emp empcurtyp;
-- after result set is built, process all the rows inside a single procedure
-- rather than calling a procedure for each row
PROCEDURE process_emp_cv (emp_cv IN empcurtyp) IS
person employees%ROWTYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('-----');
DBMS_OUTPUT.PUT_LINE('Here are the names from the result set:');
LOOP
FETCH emp_cv INTO person;
EXIT WHEN emp_cv%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Name = ' || person.first_name ||
' ' || person.last_name);
END LOOP;
END;
BEGIN
-- First find 10 arbitrary employees.
OPEN emp FOR SELECT * FROM employees WHERE ROWNUM < 11;
process_emp_cv(emp);
CLOSE emp;
-- find employees matching a condition.
OPEN emp FOR SELECT * FROM employees WHERE last_name LIKE 'R%';
process_emp_cv(emp);
CLOSE emp;
END;
/


Merge

CREATE TABLE bonuses (employee_id NUMBER, bonus NUMBER DEFAULT 100);

INSERT INTO bonuses(employee_id)
(SELECT e.employee_id FROM employees e, orders o
WHERE e.employee_id = o.sales_rep_id
GROUP BY e.employee_id);

SELECT * FROM bonuses;

EMPLOYEE_ID	 BONUS
-----------	----------
153			100
154			100
155			100
156			100
158			100
159			100
160			100
161			100
163			100

MERGE INTO bonuses D
USING (SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 80) S
ON (D.employee_id = S.employee_id)
WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
DELETE WHERE (S.salary > 8000)
WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
VALUES (S.employee_id, S.salary*0.1)
WHERE (S.salary <= 8000);

EMPLOYEE_ID	  BONUS
-----------	----------
153			180
154			175
155			170
159			180
160			175
161			170
179			620
173			610
165			680
166			640
164			720
172			730
167			620
171			740

تم التعديل بواسطة hanyfreedom, 18 November 2007 - 01:58 AM.


#4 ahmedselim

ahmedselim

    عضو

  • الأعضــاء
  • 39 مشاركة

تاريخ المشاركة 18 November 2007 - 03:33 AM

السلام عليكم ورحمة الله وبركاته
merge
كود يستخدم لعمل ادخال او تعديل بين جدولين
يعني في جدولين نبدأ نقارن بين البيانات اللي فيهم
بحيث ان الجدول الاول يكون فيه نفس البيانات اللي في الجدول الثاني
عن طريق شرط معين
في حاله انها موجوده مسبقا في الجدول الاول
يتم التعديل في الجدول الاول عن طريق الثاني
واذا كانت غير موجوده في الجدول الاول يتم ادخالها من الجدول الثاني .
والله أعلم

#5 ahmedselim

ahmedselim

    عضو

  • الأعضــاء
  • 39 مشاركة

تاريخ المشاركة 18 November 2007 - 03:51 AM

السلام عليكم ورحمة الله وبركاته
Ref Cursor
نفس مفهوم الكرسور العادي
إلا انه يمكن استخدامه لكذا جملة sql
يعني احنا الاول بنعمل datatype نوعها ref cursror
وبعد كده بنعمل variable
التايب بتاعه هيه ال datatype
اللي احنا عملناها الاول "زي مبنعمل variable داتا تايب بتاعه number"
وكل مره بفتح الكرسور بفتح ال variable
على جملة sql مختلفة..
OPEN variable_name FOR SELECT column_name FROM Table_name1;
OPEN variable_name FOR SELECT column_name FROM Table_name2;
OPEN variable_name FOR SELECT column_name FROM Table_name3;
والله أعلم