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

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

صورة
- - - - -

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


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

#1 sky information

sky information

    عضو نشط

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

تاريخ المشاركة 11 May 2007 - 02:21 PM

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

================================
اطلعت على موضوع في احد المواقع وحبيت ان افيدكم به
=================================
ميزة واحدة في أغلب الأحيان يغض النظر عنها المطورين وهي قدرة 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 أو المطور باستعمال الأسماء الحالية للوظائف أو الإجراءات

#2 -=|mOOdY|=-

-=|mOOdY|=-

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

  • المجموعة الماسية
  • 1,324 مشاركة

تاريخ المشاركة 11 May 2007 - 03:13 PM

موضوع شيق اخي الكريم

بارك الله فيك

صورة

!!! كم أنت عبقري !!!


#3 sky information

sky information

    عضو نشط

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

تاريخ المشاركة 11 May 2007 - 06:22 PM

شكرا لمرورك اخي moody

#4 amino1

amino1

    عضو نشط

  • الأعضــاء
  • 272 مشاركة
  • الاسم الأول:أمين
  • اسم العائلة:صلاح الدين
  • البـلـد: Country Flag
  • المنصب الحالي:المدير التقني لمؤسسة البوابة المتقدمة

تاريخ المشاركة 11 May 2007 - 08:03 PM

جزاك الله خير وأنار بصيرتك :)

اللهم علمنا ما ينفعنا و أنفعنا بما علمتنا

أبو نسيبة

سبحان الله والحمد لله ولا إله إلا الله و الله أكبر
موقع إذاعة طريق الإسلام