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

Execute Immediate


waleedamin

Recommended Posts

يمكنك استخدامها لتنفيذ أوامر sql بشكل ديناميكى بخيارات عديدة
مثﻻ

declare
 v_1 varchar2(30);
begin execute immediate 'select last_name from employees where employee_id = 100' into v_1; dbms_output.put_line(v_1);
end


و

declare
 v_1 varchar2(30);
 v_2 number(4) := 100;
begin execute immediate 'select last_name from employees where employee_id = :1' Into v_1 using v_2; 
 dbms_output.put_line(v_1);
end;



كما فى المثالين السابقين يتم استخدام into لوضع متغيرات للاحتفاظ بالقيم المعادة من الجملة المنفذة فالناتج يتم تخزينه فى v_1
أما using فتستخدم كما فى المثال السابق لتقييم الـ <1:> bind Arguments فعند التنفيذ يتم وضع قيمة v_2 بدﻻ من :1

يمكنك استخدام returning into مع جمل dml التى تحتوى على returning فقط
مثال

declare
sql_stmt varchar2(200);
v_empid employees.employee_id%type := 100;
v_sal	number(8, 2);
begin sql_stmt := 'update employees set salary = 28000 where employee_id = :1  RETURNING sal INTO :2'; EXECUTE IMMEDIATE sql_stmt USING v_empid RETURNING INTO v_sal; dbms_output.put_line('New Sal is:' || v_sal);
end;



يمكن استخدام نوع المتغير out مع using ولكنى ﻻ استطيع ان استخدمها الا بشكل واحد هذا مثال عليه
باعتبار وجود هذه الدالة

CREATE OR REPLACE FUNCTION CallFunc(p1 IN VARCHAR2)
  RETURN VARCHAR2 AS BEGIN DBMS_OUTPUT.PUT_LINE('CallFunc called with ' || p1);
  RETURN p1;
END CallFunc;


DECLARE
v_Result VARCHAR2(50);
BEGIN EXECUTE IMMEDIATE
     'CALL CallFunc(''any text to be printed out'') INTO :v_Result' USING OUT v_Result;
    dbms_output.put_line(v_result);
END
رابط هذا التعليق
شارك

السلام عليكم.. شكرا للاخوان لاثارة وتوضيح هذه الخاصية بس انا كان عندي سوأل وهو هل يمكن استخام هذه الخاصية ( EXECUTE IMMEDIATE) من اجل عمل استعلام من جداول متغيرة ؟ اي يكون اسم الجدول هو الذي يتغير. انا احاول استخام اوراكل APEX من اجل بناء تقرير وفورمة واحدة لعدد من الجداول وصار لي كم يوم بحاول اضبط هذه الخاصية فلو ممكن توضيح ما هي الصعوبة في جعل اسم الجول هو المتغير ؟

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

اخ عبود ﻻيوجد صعوبة المشكلة انه ﻻ يمكنك الا استقبال row واحد فقط ولو اردت استقبال اكثر من row فعيك باستخدام الـ cursor فهذه وظيفتها ودع execute immediate لتنفيذ DDL - DCL

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

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

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

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

×   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.

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

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

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