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

الref Cursor And Merg


the past

Recommended Posts

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.

رابط هذا التعليق
شارك

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
رابط هذا التعليق
شارك

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

رابط هذا التعليق
شارك

السلام عليكم ورحمة الله وبركاته
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;
والله أعلم

رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية