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

دمج زيادة التحميـــــــــل و إدارة الجلسة في الأوراكل


sky information

Recommended Posts

دمج زيادة التحميـــــــــل و إدارة الجلسة في الأوراكل

================================
اطلعت على موضوع في احد المواقع وحبيت ان افيدكم به
=================================
ميزة واحدة في أغلب الأحيان يغض النظر عنها المطورين وهي قدرة pl/sql بالسماح
بزيادة التحميل (overloading).
كما في لغات البرمجة الأخرى فإن زيادة التحميل تحدث حينما يستعمل المبرمج نفس الاسم للإجراء أو الوظيفة وباستغلال بعض المميزات الرئيسية من pl/sql و DBA
يمكن بسرعة وسهولة بناء جلسة متعددة الاستعمال

مثال نموذجي لزيادة التحميل
واحد من ابسط الأمثلة دائما يشاهد في لغات البرمجة (C, C++, java) وهي الأمثلة المتعلقة بحساب مساحة المستطيل وهي كما يعرف تساوي الطول في العرض
لذا فإن الوظيفة(( function التي تعود بقيمة المساحة تحتاج لبراميتر يمر من خلالها
في الحالات التي يكون فيها الطول مساوي للعرض فإن الوظيفة التي تعود بمساحة المستطيل تحتاج فقط لبراميتر واحد وغير ذلك براميتران

أما الوظيفتان أو الوظيفة المزيدة التحميل باختلاف التوقيع يمكن بسهولة أن تكون مبنية
كالتالي :

create function compute_area 
 (width number, length number) 
 return number is
 area number;
begin
 area:= width * length;
 return area;
end;
/
create function compute_area 
 (side number) 
 return number is
 area number;
begin
 area:=side*side;
 return area;
end;
/



ولا كن هل سيكون صحيح القول أن ذلك الاستعمال ينطبق على الاستعمال في
الأوراكل :

1-	select compute_area(5, 3) from dual;
	   2-select compute_area(5) from dual;


الجواب هو نعم – ولا.

دعنا نبدأ بالجانب الخاطئ أولا :

هل الاوراكل تسمح بمشاركة نفس الاسم لأكثر من كائن؟
إذا نفذ المثال كما هو مكتوب في الأعلى كما هو سيكون الناتج خطأ
ORA-00955: name is already used by an existing object

ماذا لو عبارة create في الوظيفة استعملت create or replace بدلا من عبارة create نفسها؟
في هذه الحالة ستكون الوظيفة الأخيرة هي المتأثرة وسوف يتم استبدالها .

أما بالنسبة للجانب الصحيح :
لاستعمال زيادة التحميل فإن هذه الوظائف يجب أن تكون جزء من الحزمة (package )
ونرجع الآن كيف يكون زيادة التحميل مفيد لـ DBA , إن الوظائف الآن ستصبح إجراءات وسوف ينتج عنها عملية (kill session ) مستندة على إدخال
(username or sid) . إن اسم الأجراء سيكون نفسه للإجراءين ولكن سيكون هنالك اختلاف في البارميترات التي تعتبر في دورها التوقيع .
كون القدرة على (kill a single session ) معتمدة على sid للمستخدم أما كون القدرة على ((kill multiple users معتمدة على username

PACKAGE :

من المهم معرفة انه بدون الرزمة فإن زيادة التحميل تكون غير مسموحة. أول خطوة هي إنشاء رأس الحزمة
(الذي يحوي أسماء الإجراءات بتواقيعهم ) والخطوة الثانية هي إنشاء جسم الحزمة وهذا المثال :

create or replace package manage_users as
 procedure kill_user(the_sid in number);
 procedure kill_user(the_user in varchar2);
end manage_users;
/
create or replace package body manage_users as
 procedure kill_user(the_sid in number) as
v_str varchar2(50) := 'alter system kill session '||chr(39);
v_serial number;
 begin
dbms_output.put_line(chr(10));
dbms_output.put_line('Session to be killed:');
dbms_output.put_line('---------------------');
select serial# into v_serial
from v$session
where sid = the_sid;
v_str := v_str||the_sid||','||v_serial||chr(39)||';';
dbms_output.put_line(v_str);
exception
when no_data_found then
  dbms_output.put_line('No such session.');
 end;
 procedure kill_user(the_user in varchar2) as
v_str varchar2(50) := 'alter system kill session '||chr(39);
v_statement varchar2(50);
cursor user_cur is
select sid, serial#
from v$session
where username = upper(the_user);
 begin
dbms_output.put_line(chr(10));
dbms_output.put_line('Sessions to be killed:');
dbms_output.put_line('----------------------');
for user_rec in user_cur loop
 v_statement := v_str||user_rec.sid||','||user_rec.serial#||chr(39)||';';
 dbms_output.put_line(v_statement);
 v_statement := null;
end loop;
 end;
end manage_users;



وهنا طريقتان لاستدعاء أو تنفيذ الحزمة :

1-	exec manage_users.kill_user('scott');
	   2- exec manage_users.kill_user(141);



ما عليك بعد تنفيذ هذه الحزمة هو نسخ ولصق العبارات

في النهاية:
زيادة التحميل تسمح لـ DBA أو المطور باستعمال الأسماء الحالية للوظائف أو الإجراءات

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

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

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

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

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

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

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

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