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

دروس Pl/sql من الألف الى الياء


miash80

Recommended Posts

أخي miash80 جزاك الله عنا كل خير وارجو الاستمرار في الدروس بهذا الاسلوب كونه اسلوب واضح وبسيط مع الشكر الجزيل لك ولجهودك

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

  • الردود 147
  • البداية
  • اخر رد

أكثر المشاركين في هذا الموضوع

  • miash80

    71

  • masmas1001

    9

  • deamon

    8

  • hannona

    6

جزاك الله كل خير يا اخى عمل رائع ومشكور ومقبول باذن الله
الى جانب طريقة الشرح سهلة مبسطة للغاية


الله يبارك فيك اخي الفاضل

والحمدلله انوا اسلوب الشرح سهل

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

اخي العزيز miash80 ارجوا ان تكون بخير وفي احوال جيدة

نحن بانتظارك لاكمال الدروس بهذا الاسلوب الذي تعودنا علية منك

وجزاك الله خير ودوام الصحة والعافية



اهلا بأخي العزيز

اخي انا اسمي موسى

وإن شاء الله اليوم سأكمل موضوع الـــــــــ Prcedure
رابط هذا التعليق
شارك

أخي miash80 جزاك الله عنا كل خير وارجو الاستمرار في الدروس بهذا الاسلوب كونه اسلوب واضح وبسيط مع الشكر الجزيل لك ولجهودك


اهلا وسهلا بأختي الفاضلة المبرمجة المبتدئة

والله يبارك فيكي

وعقبال ما ناديكي بالمبرمجة الاولى

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

السلام عليكم ورحمة الله وبركاته



أسف اخواني الاعزاء على هذا التأخير في تكملة الدروس بسبب ضغوط الشغل هذه الايام

إن شاء الله يوم السبت سأكمل بقية الدروس

اكرر أسفي اخواني الاعزاء

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

السلام عليكم ورحمة الله وبركاته

اكرر أسفي اخواني الاعزاء للتأخري في تكملة كتابة الدروس

اليوم أنشاء الله سنكمل الدروس

توقفنا في الدرس السابق عند هذا المثال

مثال جديد اريد ان أستخدم فيه خاصية الاضافة


اريد ان اكتب Procedure يقوم باضافة أسم وموقع القسم في جدول الاقسام


QL> create or replace procedure insert_dept (p_dname in dept.dname%type,p_loc in dept.loc%type)
 2  is
 3  v_deptno number;
 4  begin
 5  select max(deptno)
 6  into v_deptno
 7  from dept;
 8  v_deptno:=v_deptno+10;
 9  insert into dept
10  values(v_deptno,p_dname,p_loc);
11  commit;
12* end;
SQL> /

Procedure created.



طريقة الاستدعاء


SQL> begin
 2  insert_dept('Finance','Amman');
 3  end;
 4  /

PL/SQL procedure successfully completed.



ولتأكد من انه اضاف البيانات الجديدة

SQL> select *
 2  from dept;

  DEPTNO DNAME		  LOC
--------- -------------- -------------
   10 ACCOUNTING	 NEW YORK
   20 RESEARCH	   DALLAS
   30 SALES		  CHICAGO
   40 OPERATIONS	 BOSTON
   50 Finance			Amman







طيب في حالة اريد ان اضيف اسماء اقسام جديدة

وكلها موجودة في موقع واحد ولا اريد ان اكرر في كل مرة اسم الموقع

الموضوع بسيط جدا جدا جدا في الدرس القادم مع تكلمة الشرح لموضوع الـــ Procedure

الحل بسيط جدااا نكتب بعد تعريف الحقل =: ونكتب بعدها القيمة التي نريد او نكتب كلمة Default كالتالي

QL> create or replace procedure insert_dept (p_dname in dept.dname%type,p_loc in dept.loc%type:='Amman')
 2  is
 3  v_deptno number;
 4  begin
 5  select max(deptno)
 6  into v_deptno
 7  from dept;
 8  v_deptno:=v_deptno+10;
 9  insert into dept
10  values(v_deptno,p_dname,p_loc);
11  commit;
12* end;
SQL> /

Procedure created.




أو بأستخدام كلمة Default

SQL> create or replace procedure insert_dept (p_dname in dept.dname%type,p_loc in dept.loc%type Default 'Amman')
 2  is
 3  v_deptno number;
 4  begin
 5  select max(deptno)
 6  into v_deptno
 7  from dept;
 8  v_deptno:=v_deptno+10;
 9  insert into dept
10  values(v_deptno,p_dname,p_loc);
11  commit;
12* end;
SQL> /

Procedure created.



طريقة الاستدعاء

SQL> begin
 2  insert_dept('Tax');
 3  end;
 4  /

PL/SQL procedure successfully completed.



قمنا فقط بأدخال اسم القسم ولم ندخل اسم الموقع لانه يوجد قيمة له وهي Amman


ولتأكد من انه اضاف البيانات الجديدة

SQL> select *
 2  from dept;
DEPTNO DNAME		  LOC
--------- -------------- -------------
   10 ACCOUNTING	 NEW YORK
   20 RESEARCH	   DALLAS
   30 SALES		  CHICAGO
   40 OPERATIONS	 BOSTON
   50 Finance		Amman
   60 Tax			Amman




طيب اذا اردنا ان نثبت اسم القسم في اكثر من منطقة ماذا العمل .

على سبيل المثال اربد ان اضع قسم الضريبة في اكثر من منطقة .

والحل كالأتي .

SQL> create or replace procedure insert_dept (p_dname in dept.dname%type :='Tax' ,p_loc in dept.loc%type)
 2  is
 3  v_deptno number;
 4  begin
 5  select max(deptno)
 6  into v_deptno
 7  from dept;
 8  v_deptno:=v_deptno+10;
 9  insert into dept
10  values(v_deptno,p_dname,p_loc);
11  commit;
12* end;
SQL> /

Procedure created



وطريقة الاستدعاء في هذه الحالة تختلف شيئ بسيط كالتالي

عند استدعاء الـــ Procedure القيمة الاولى معروفة وموجودة وهي اسم القسم

ولا داعي لوضع قيمة لها اما القيمة الثانية وهي اسم الموقع غير موجودة لذلك نضع القيمة لها

طيب كيف تعرف هذه القيمة للأسم القسم ام للأسم الموقع بسيطة نعمل عملية قفز للبيانات

وتتم عملية القفز بوضع أشارة <= قبل القيمة التي نريد أدخالها كالتالي .


SQL> begin
 2  insert_dept(P_Loc=>'Irbid');
 3  end;
 4  /

PL/SQL procedure successfully completed.



في هذه الحالة يأخذ القيمة للأسم القسم ويقفز ويأخذ قيمة أسم الموقع .

ولتأكد من انه اضاف البيانات الجديدة


SQL> select *
 2  from dept;
DEPTNO DNAME		  LOC
--------- -------------- -------------
   10 ACCOUNTING	 NEW YORK
   20 RESEARCH	   DALLAS
   30 SALES		  CHICAGO
   40 OPERATIONS	 BOSTON
   50 Finance		Amman
   60 Tax			Amman
   70 Tax			Irbid



سأكرر العملية اكثر من مرة وسأقوم كل مرة بأضافة جديدة

SQL> begin
 2  insert_dept(P_Loc=>'Salt');
 3  end;
 4  /

PL/SQL procedure successfully completed.




ومرة اخرى أقوم بأضافة



SQL> begin
 2  insert_dept(P_Loc=>'Zarqa');
 3  end;
 4  /

PL/SQL procedure successfully completed.



ولتأكد من انه اضاف البيانات الجديدة



SQL> select *
 2  from dept;
DEPTNO DNAME		  LOC
--------- -------------- -------------
   10 ACCOUNTING	 NEW YORK
   20 RESEARCH	   DALLAS
   30 SALES		  CHICAGO
   40 OPERATIONS	 BOSTON
   50 Finance		Amman
   60 Tax			Amman
   70 Tax			Irbid
   80 Tax			Salt
   90 Tax			Zarqa



طيب اريد ان اعمل اضافة مرة اخرى لنرى ماذا يحصل



SQL> begin
 2  insert_dept(P_Loc=>'Mafraq');
 3  end;
 4  /
begin
*
ERROR at line 1:
ORA-01438: value larger than specified precision allows for this column
ORA-06512: at "SCOTT.INSERT_DEPT", line 9
ORA-06512: at line 2



ما هذا الخطأ ...!!! طيب انا عندي سؤالين ...!!!

لماذا هذا الـــError ...؟

هل المستخدم العادي سيفهم هذا الخطأ ...؟

سأجيب على السؤالين بنفسي.

احابة السؤال الاول هذا الخطأ ظهر بسب رقم القسم وصل لغاية الرقم 90

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

عرفناه number(2) لنرى مواصفات هذه الجدول .


SQL> Desc Dept;
Name							Null?	Type
------------------------------- -------- ----
DEPTNO						  NOT NULL NUMBER(2)
DNAME									VARCHAR2(14)
LOC									  VARCHAR2(13)



والاجابة على السؤال الثاني

هي لأ طبعا المستخدم العادي لا يعرف معنى هذا الــ Error

طيب ما العمل

بسيطة اقوم بالتعديل على الــ Procedure بحيث اذا قام المستخدم العادي

بأضافة اقسام اكثر من الرقم المحدد نخرج من الـــ Procedure ونعطيه رسالة

واضحة بانه لا يصح اضافة اقسام جديدة كالتالي .



SQL> ed
Wrote file afiedt.buf

 1  create or replace procedure insert_dept (p_dname in dept.dname%type :='Tax' ,p_loc in dept.loc%
 2	   is
 3	   v_deptno number;
 4	   begin
 5	   select max(deptno)
 6	   into v_deptno
 7	   from dept;
 8	   v_deptno:=v_deptno+10;
 9	 if v_deptno > 90 then
10	 raise_application_error(-20100,'You Can Not Insert More Department ...');
11	 else
12	  insert into dept
13	values(v_deptno,p_dname,p_loc);
14  end if;
15	commit;
16*   end;
SQL> /



لنحاول الاضافة مرة أخرى



SQL> begin
 2  insert_dept(P_Loc=>'Mafraq');
 3  end;
 4  /
begin
*
ERROR at line 1:
ORA-20100: You Can Not Insert More Department ...
ORA-06512: at "SCOTT.INSERT_DEPT", line 10
ORA-06512: at line 2line 2



طيب يوجد لدينا امر جديد وهو




raise_application_error(-20100,'Write Message Reason Exit ...');




هذا الامر يتعبر من الــ Exception اذا يقوم بالخروج من البرنامج مع اعطاء رسالة بسبب الخروج

هذا الامر جاهز من اوراكل يكتب بطريقة السابقة مع تغير صيغة الرسالة بحيث تناسب كل حالة

اذا raise_application_error جاهزة لا يغير فيها اي شي

-20100 وهذا الرقم نكتب بمدى معين وهو -20000 الى 29999

ونكتب بين هذا الرمز ' ' الرسالة التي نريد


طيب في حالة اريد ان ارى الــProcedure التي قمت بأنشائها من قبل والعمل على التعديل عليها

او القيام بحذفها ما هي الاوامر التي استطيع من خلالها القيام بهذه الامور .

الموضوع بسيط جداً جداً جداً في الدرس القادم

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

السلام عليكم ورحمة الله وبركاته

في الدرس السابق تكلمنا عن الاوامر الخاصة بالـــProcedure

هذه الجمل نستخدمها لاخراج أسماء الــTable والــProcedure والـــFunction والــTrigger والــPackage

وهي هذه الجمل


SELECT *
FROM all_errors;

SELECT *
FROM all_source;

SELECT *
FROM user_objects;

SELECT *
FROM dba_errors;

SELECT *
FROM dba_object_size;

SELECT *
FROM dba_source;

SELECT
FROM user_errors;

SELECT *
FROM user_source;

SELECT *
FROM user_object_size;





ومن خلال هذه الجمل نستطيع وضع شروط لاخراج بيانات معينة مثل تحديد نوع البيانات مثل اريد اسماء الــProcedure فقط كالتالي

SELECT *
FROM user_source
where type='PROCEDURE';



او اسماء الــFunction

SELECT *
FROM user_source
where type='FUNCTION';




بنفس الطريقة الــTrigger و الــــPackage


واستطيع ان اضع شرط اسم الــProcedure


SELECT *
FROM user_source
where type='PROCEDURE'
and  name='insert_dept';



واستطيع ان اضع شرط اسم اليوزر اذا دخلت من خلال يوزر الــSystem

SELECT *
FROM dba_source
WHERE OWNER='SCOTT';



وهكذا


ومن خلال هذه الجمل استطيع التعديل على الــProcedure

من خلال الحقل Text بحيث اخذ نسخة من الــProcedure وأقوم بالتعديل عليه

وهذا الحقل موجود في معظم الجداول السابقة

والجداول هي


all_errors;

all_source;

dba_errors;

dba_source;

user_errors;

user_source;




اما الامر الخاص بعملية حذف الـــProcedure هو

DROP PROCEDURE PROCEDURE_NAME;




مثال


SQL> DROP PROCEDURE INSERT_DEPT;

Procedure dropped.



في الدرس القادم إن شاء الله اذا لم يكن هنالك اسئلة سنتحدث عن ابن عم الــــProcedure



اتعرفون من هو ابن عم الــProcedure أنه الــFunction :unsure: :( :(

لهم صفات مشتركة ولهم صفات مختلفة

لنرى في الدرس القادم هذه الصفات إن شاء الله

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

جزاك الله خيرا على الدروس القيمه اللى استفدت منها شخصيا
بس فة حلقه مفقوده عندى ياريت توضها ليا
انا دلوقتى اتعلمت sql
واتعلمت pl/sql من فترة ودلوقتى بفهمها اكتر من دروس حضرتك
طيب الحاجات ده كلها
ليه بنطبقها على sql*plus يعنى ايه وجه الاستفاده اننا بنطبقها على sql*plus
انا فاهم ان بنطيق sql على sql*plus عشان نفهم الاوامر
طيب ودلوقتى ليه بنطبق pl/sql على برنامج sql*plus عشان بردو نفهم الاوامر ولا عشان حاجه تانيه
ياريت من فضلك طلب
تعمل مثال على دروسك حضرتك وكيفيه يمكن الاستفادخ به فى forms عشان الواحد يكون فهم بالظبط بناءا على وضع مثال بسيط لان ده هيوضح حاجت كتير ان شاءالله

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

جزاك الله خيرا على الدروس القيمه اللى استفدت منها شخصيا
بس فة حلقه مفقوده عندى ياريت توضها ليا
انا دلوقتى اتعلمت sql
واتعلمت pl/sql من فترة ودلوقتى بفهمها اكتر من دروس حضرتك
طيب الحاجات ده كلها
ليه بنطبقها على sql*plus يعنى ايه وجه الاستفاده اننا بنطبقها على sql*plus
انا فاهم ان بنطيق sql على sql*plus عشان نفهم الاوامر
طيب ودلوقتى ليه بنطبق pl/sql على برنامج sql*plus عشان بردو نفهم الاوامر ولا عشان حاجه تانيه
ياريت من فضلك طلب
تعمل مثال على دروسك حضرتك وكيفيه يمكن الاستفادخ به فى forms عشان الواحد يكون فهم بالظبط بناءا على وضع مثال بسيط لان ده هيوضح حاجت كتير ان شاءالله


الله يبارك فيك أخي الفاضل خالد

كلامك افرحني اخي العزيز لانك أستفدت من هذه الدروس

وبالنسبة للحلقة المفقودة

احنا بنطبق الSQL والــPL/SQl على sql*plus لانه هذه بيئة التطبيق الخاصة بها

وكذلك نقدر ان نطبق جمل الــSQl والــPL/SQL على الـــForm

وانا أن شاء الله سأقوم بكتابة بعض الامثلة على الــProcedure والــFunction وتطبيقها على الــForm

ولكن بعد ما انتهي من شرح الــFunction وانا جاهز لأي أستفساء ان شاء الله
رابط هذا التعليق
شارك

بارك الله فيك يا اخي وارجو منك الاستمرار كوننا نستفيد منك بشكل ممتاز واعانك الله على فعل الخير دائما



الله يبارك فيكي اختي الفاضلة

انا اسف للتأخري في كتابة الدروس

اليوم أن شاء الله سأشرح الــFunction

وانا جاهز لأي أستفسار اختي الفاضلة
رابط هذا التعليق
شارك


السلام عليكم ورحمة الله وبركاته

اسف اخواني الاعزاء في التأخر في تكملة الدروس

اليوم سنقوم بشرح للـــFunction ابن عم الـــــــProcedure

ولكن لنعمل مراجعة بسيطة للــتعريف الـــ Procedure

قلنا انا الــProcedure هو عبارة عن برنامج له اسم ويخزن في قاعدة البيانات ويمرر له براميتر

ويرجع لي قيمة معينة ويقوم بأكثر من عملية في البرنامج الواحد وأستطيع استدعائه في أي وقت انا بحاجته

واقوم بتنفيذه .

عندي أضافة في التعريف الــ Procedure ممكن يرجع قيمة وحدة وممكن ان يرجع اكثر من قيمة

لاكثر من نوع من البيانات او يرجع اكثر من قيمة من نفس النوع وممكن ان لا يرجع أي قيمة .(((كلام جميل )))

الان سنبدء في الشرح عن ابن عم الــــ Procedure وهو ابن العم الــFunction .

بسم الله نبدء

اولا سنقوم بتعريف الــFunction .

تعريف رقم (((1)))

هو عبارة عن برنامج له اسم ويخزن في قاعدة البيانات ويمرر له براميتر

ويرجع لي دائما قيمة واحدة فقط ويجب ان يرجع قيمة (((احد الفروق مع الــ Procedure)))

ويقوم بأكثر من عملية في البرنامج الواحد وأستطيع استدعائه في أي وقت انا بحاجته

تعريف رقم (((2)))

هو عبارة عن برنامج بخيل جداًاًاًاًاً بحيث لا يقوم الا بأرجاع قيمة واحدة فقط

تعريف رقم (((3)))

هو عبارة عن برنامج شايف حاله لا يقوم الا بنقل كبار الزوار ((( الطبقة المخملية)))

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

في كل مرة يقوم البرنامج بعمله .

والان سنقوم بشرح كيفية كتابة الـــ Function



Create [Or Replace] Function Function-Name   هنا نقوم بأنشاء الاقتران   
(P1 in Number,P2 out Varchar2,P3 in out date....) هنا نقوم بتعريف البراميتر  
Return Data Type	 هنا بوضع نوع البيانات التي سيقوم الــFunction  بأرجاعها 
Is   كلمة اجبارية  
Variables   Decleration Section هذا الجزء من البرنامج يعرف فيه المتغيرات بأنواعها   

Begin   (Mandatory)  بداية الاجراء  وهذا الجزء أجباري

Eexcutable Section	هنا يكتب كود البرمجة الخاص بالبرنامج 
Pl/Sql Code

.
.
.
Return  Value;  هنا نضع القيمة التي يريد الــFunction أرجاعها 
[Exception]  (Optional)هذا الجزء خاص بمعالجة أخطاء الاجراء وهو أختياري	 
.
.
.
Return  Value;  هنا نضع القيمة التي يريد الــFunction أرجاعها  في حالة حدوث Error
End [Function-Name];  (Mandatory)  نهاية البرنامج وهذا الجزء أجباري




سنبدء في مثال صغير للكتابة الــــFunction

أريد ان اكتب برنامج صغير يقوم بجمع رقمين وأخراج الناتج

بسم الله نبدء

SQL> set serveroutput on
SQL> set verify off
SQL> create or replace function Tot(X in number,Y in number)
 2  Return Number
 3  is
 4  Begin
 5  Return X+Y;
 6  end;
 7  /

Function created.



الان سنقوم بأستدعاء الـــFunction كألاتي .

يجب تعريف متغير من نفس نوع القيمة التي سيقوم الــ Function بأسترجاعها

لوضع قيمة الـــ Function فيها كألاتي .

PL/SQL procedure successfully completed.

SQL> Declare
 2  Z number;
 3  begin
 4  Z:=Tot(8,9);
 5  Print('Total = '||Z);
 6  end;
 7  /
Total = 17

PL/SQL procedure successfully completed.



او أستخدام هذه الطريقة لادخال ارقام مختلفة في كل مرة .

SQL> Declare
 2  Z number;
 3  Begin
 4  Z:=Tot(&N1,&n2);
 5  Print('Total  = '||Z);
 6  end;
 7  /
Enter value for n1: 7
Enter value for n2: 5
Total  = 12

PL/SQL procedure successfully completed.

SQL> /
Enter value for n1: 90
Enter value for n2: 77
Total  = 167

PL/SQL procedure successfully completed.

SQL> /
Enter value for n1: 50
Enter value for n2: 80
Total  = 130

PL/SQL procedure successfully completed.



مثال جديد .

أريد ان اكتب Function يحسب الراتب السنوي .

بسم الله نبدء


SQL> Create or replace Function Ann_Sal(P_sal in number,P_Comm in number)
 2  Return Number
 3  is
 4  Begin
 5  Return P_sal*12+nvl(p_Comm,0);
 6  end;
 7  /

Function created.



وطريقة الاستدعاء هي .

SQL> Declare 
 2  V_Sal Number;
 3  Begin
 4  V_Sal:=Ann_Sal(100,10);
 5  Print('Salary Year =  '||V_Sal);
 6  end;
 7  /
Salary Year =  1210

PL/SQL procedure successfully completed.




مثال جديد .

أريد ان اكتب نفس المثال السابق ولكن اريد ان اعطيه رقم الموظف ويحسب الراتب السنوي

SQL> ed
Wrote file afiedt.buf

 1   Create or replace Function Ann_Sal(P_Empno in number)
 2   Return Number
 3   is
 4	V_Ann number;
 5   Begin
 6   Select  sal*12+nvl(Comm,0)
 7   into  V_Ann
 8   From  Emp
 9	Where Empno=P_Empno;
10	Return V_Ann;
11   Exception
12   When Others Then
13   Return  0;
14*  end;
15  /

Function created.



وطريقة الاستدعاء .


SQL> Declare
 2  V_sal Number;
 3  Begin
 4  v_sal:=Ann_Sal(&P_Empno);
 5  Print('Salary Year = '||V_sal);
 6  end;
 7  /
Enter value for p_empno: 7900
Salary Year = 11400

PL/SQL procedure successfully completed.

SQL> /
Enter value for p_empno: 7782
Salary Year = 29400

PL/SQL procedure successfully completed.

SQL> /
Enter value for p_empno: 7876
Salary Year = 13200

PL/SQL procedure successfully completed.



أما في حالة ادخلنا رقم خطأ ما هي النتيجة لنرى .

SQL> /
Enter value for p_empno: 5444
Salary Year = 0

PL/SQL procedure successfully completed.



لقد قام بأرجاع القيمة صفر الموجودة داخل الــ Exception

مثال جديد .

أريد ان اكتب Function اعطيه رقم الموظف يعطيني رقم مديره .


create or replace function Manger(P_Empno in number)
Return Varchar2
is
Cursor C_Manger is
select m.ename
from emp e,emp m
where e.mgr=m.empno
and   e.empno=p_empno;
V_Manger C_Manger%rowtype;
begin
open  C_Manger;
fetch  C_Manger
into  V_Manger;
If C_Manger%Notfound then
Return 'Big Bossss';
else
Return V_Manger.Ename;
end if;
Close C_Manger;
end;
SQL> /

Function created.



وطريقة الاستدعاء


SQL> Declare
 2  V_Manager Varchar2(100);
 3  Begin
 4  V_Manager:=Manger(&P_Empno);
 5  Print('Manger Name  :  '||V_Manager);
 6  end;
 7  /
Enter value for p_empno: 7369
Manger Name  :  FORD

PL/SQL procedure successfully completed.

SQL> /
Enter value for p_empno: 7698
Manger Name  :  KING

PL/SQL procedure successfully completed.

SQL> /
Enter value for p_empno: 7934
Manger Name  :  CLARK

PL/SQL procedure successfully completed.





طيب على فرض أدخلنا رقم موظف ليس له رقم مدير ماذا يحصل


SQL> /
Enter value for p_empno: 7839
Manger Name  :  Big Bossss

PL/SQL procedure successfully completed.



الموظف الذي ليس له مدير هو المدير الرئيسي


كلام جميل الان بعد هذا الشرح للكل من الـــProcdeure والـــFunction هل لاحظتم ما هي الفروق بينهم

في الدرس القادم سأعطي شرح بسيط للمقارنة بين الــProcedure والــ Function في حالة عدم وجود اسئلة .

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

منتظر بقيه الدروس ان شاء الله جزاك الله خيرا
ومنتظر الامثله داخل الفورمز ان شاء لله


الله يبارك فيك اخي خالد

وانا اسف على التأخير

أن شاء الله سأتابع الدروس اليوم
رابط هذا التعليق
شارك

السلام عليكم ورحمة الله وبركاته

اخواني الاعزاء سأتابع الدروس ....

في الدرس السابق شرحنا الــــFunction وقلنا سنكتب مقارنة بسيطة بين الـــProcedure والـــFunction اولاد العم .

بسم الله نبدء

من خلال الدروس السابقة للــــProcedure والــــFunction نستنتج بعض الفروق كالتالي .

								function				  procedure

Parametrs Mode	 In							  In   , In Out  , Out

Return  Value		 Always					   Return  One Value Or More Value Or No Value

Calling				   SQL AND PL/SQL		PL/SQL

USE						 Calculation			  Mult Task




وفي الدرس القادم سنكتب بعض الامثلة على تطبيق الـــProcedure والـــFunction على الـــForm

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

السلام عليكم ورحمة الله وبركاته

أخواني الاعزاء سنبدء اليوم بكتابة بعض الامثلة على الـــــ Function والـــــProcedure وتطبيقها على الفورم .

بسم الله نبدء ...

مثال على أستخدام الـــProcedure في الفورم .


على سبيل المثال عندي شاشة الخاصة بمواعيد مراجعين الاطباء

ومن ضمن هذه الشاشة يوجد بيانات المراجعين وتأتي هذه البيانات

عند وضع رقم المريض .

طيب في حالة مريض جديد لا اريد الخروج من شاشة المواعيد

والذهاب الى الشاشة الخاصة بالمراجعين واضافة مريض

اريد ان اضيف بيانات المريض في شاشة المواعيد وبعد ان اعمل

تخزين لشاشة المواعيد يعمل اضافة مباشرة للبيانات المريض

في جدول الخاص بالمراجعين .

نبدء في كتابة الـــProcedure



طبعا نذهب الى Program Unit ونقوم بأنشاء Procedure وأسمه Insert_Pat ثم نكبس OK

فيطلع الناتج كالتالي

PROCEDURE Insert_Pat IS
BEGIN
 
END;


ثم تقوم بعملية التعديل والاضافة على الــ Procedure للقيام بالوظيفة المطلوبة منه

كالتالي .....

 Peocedure Insert_Pat(P_Pat_Id In Out Number,P_Pat_Name In Varchar2,P_Address In Varchar2,P_Mobil In number)
Is
V_Pat_Id number;
Begin
Select Nvl(Max(Pat_id),0,)+1
Into V_Pat_Id
From Patient;
Insert Into Patient(P_Id,P_Name,Address,Mobil)
Values(P_Pat_Id,P_Pat_Name,P_Address,P_Mobil);
Commit;
End;



الان نعمل Button جديد وننشأ Trigger جديد وهو When_Button_Preessed

ونستدعي داخله الــProcedure كالتالي .

Insert_Pat(:Trysts.Pat_Id,:Trysts.Name,:Trysts.Add,:Trysts.Mobil);



هنا عملنا اضافة لمرض جديد من شاشة المواعيد .

طبعا نعمل اضافة للبيانات التي نريد وبعدها نرجع للشاشة المراجعين ونعمل على تعديل البيانات .


مثال جديد على أستخدام الــــــــــــProcedure .

عندي شاشة فواتير ماستر وديتل .

اول شي اعمل جدولين خاصين بشاشة فواتير


SQL> Create Table Inv
 2	  (
 3	 inv_no number,
 4	 inv_year number,
 5	 total_inv number
 6	   );

Table created.

SQL> alter table inv
 2  add constraint inv_pk primary key (inv_no,inv_year);

Table altered.

SQL> Create Table Inv_det
 2	   (
 3	  inv_no number,
 4	  inv_year number,
 5	   item_no number,
 6	   Serail_Id  number,
 7	   qty number,
 8	   sale_price number,
 9	  sum_sale number
10	);

Table created.
SQL> alter table inv_det
 2	 add constraint inv_det_pk  primary key (INV_NO,INV_YEAR,ITEM_NO,SERAIL_ID);

Table altered.

SQL>   alter table inv_det
 2	   add constraint inv_det_fk foreign key(inv_no,inv_year)
 3	  references inv(inv_no,inv_year);

Table altered.




وبعد الربط بين الجدولين وتنسيق الفورم سنكتب Procedure يحسب ناتج ضرب الكمية والسعر

واخراج قيمة الفاتورة عن طريق جمع ناتج الضرب لكل المواد .

طبعا نذهب الى Program Unit ونقوم بأنشاء Procedure وأسمه Total_Inv ثم نكبس OK

فيطلع الناتج كالتالي ....

PROCEDURE Total_Inv IS
BEGIN
 
END;




ثم تقوم بعملية التعديل والاضافة على الــ Procedure للقيام بالوظيفة المطلوبة منه

كالتالي .

PROCEDURE Total_Inv IS
V_qty_sale number;
v_tot number;
BEGIN
 GO_BLOCK('INV_DET');
FIRST_RECORD;
loop
 V_qty_sale:=nvl(:inv_det.qty,0)*nvl(:inv_det.sale_price,0);
  :inv_det.sum_sale:= V_qty_sale;
  v_tot:=nvl(v_tot,0)+V_qty_sale;
  :inv.TOTAL_INV:= v_tot;
  exit when :system.last_record='TRUE';
  NEXT_RECORD;
END LOOP;

 END;



الان نعمل Button جديد وننشأ Trigger جديد وهو When_Button_Preessed

ونستدعي داخله الــProcedure كالتالي .

فقط تكتب اسم الــProcedure Total_Inv ;

وعند عمل Run للفــورم وكتابة القيم نكبس على الــ Button ويعطينا ناتج ضرب الكمية

مع السعر ويعطينا المجموع الكـلـي للفاتورة بأذن الله .


ألان اريد اريد ان اكتب مثال على الـــFunction وتطبيقه على الفورم .

اريد ان اكتب Function يمنعني من التعديل على الفاتورة

بحيث اذا كانت الفاتورة مخزنة يخرج مسج يخبرني غير مسموح التعديل على الفاتورة

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

نذهب الى Program Units ونقوم بأنشاء الــFunction بأسم Check_Inv

فيطلع الناتج كالتالي ....

FUNCTION check_inv RETURN _ IS
BEGIN
 
END;




ثم تقوم بعملية التعديل والاضافة على الــ Function للقيام بالوظيفة المطلوبة منه كالتالي .....

FUNCTION check_inv 
RETURN boolean 
IS
v_inv_no number;
BEGIN
select inv_no
into v_inv_no
from inv
where inv_no=:inv.inv_no;
message('Can Not Update The Invoice...');
message(' ');
return false;
exception
when no_data_found then
return true;
when others then
	message('Can Not Update The Invoice...');
message(' ');
return false;
END;



نستدعي هذا الـــFunction

نكتب في الــButton الخاص بالــProcedure الذي يقوم بالحسابات

وأسمه Total_Inv.

ونستدعي بهذا الشكل .

if check_inv then
Total_Inv;
end if;





يعني اذا الــ Function الخاص بالتأكد من الفاتورة قام بوظفته بشكل صحيح

أذهب ونفذ الـــProcedure الخاص بعملية الحسابات.




في الدرس القادم في حالة عدم وجود اسئلة

سنتحدث عن علاقة اولاد العم وصلة القرابة وكيف يرتبط اولاد العم تحت اسم عائلة واحدة

وحقوق وواجبات كل فرد في هذه العائلات ...

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

اللهم اغفر له ما تقدم من ذنبه و ما تأخر..اللهم احسن خاتمته
اللهم اغفر لوالديه و ارحمهما و ادخلهما جناتك برحمتك يا أرحم الراحمين

خيو انا لسه جديده وعم بتعلم منك ومرسي كتير لانو اسلوبك سهل ومفهوم انا لسه باديه درس درس بس ما عم بعرف وين بدي طبئ الكودات وشو البرنامج اللي
اكتب فيو هاي الكودات؟؟؟
مرسي كتير غلبتك

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

اللهم اغفر له ما تقدم من ذنبه و ما تأخر..اللهم احسن خاتمته
اللهم اغفر لوالديه و ارحمهما و ادخلهما جناتك برحمتك يا أرحم الراحمين

خيو انا لسه جديده وعم بتعلم منك ومرسي كتير لانو اسلوبك سهل ومفهوم انا لسه باديه درس درس بس ما عم بعرف وين بدي طبئ الكودات وشو البرنامج اللي
اكتب فيو هاي الكودات؟؟؟
مرسي كتير غلبتك



اهلا وسهلا بالاخت الفاضلة ....

مشكورة اختي على دعائك

اول اتمنى لكي بداية مشرقة بأذن الله في عالم اوراكل

ثاني شي اختي الفاضلة هل انتي على دراية ما هي لغة اوراكل وما هي خصائصها

ثالث شي هذه الاكود تتطبق على برنامج SQL Plus الخاص بقاعدة البيانات اوراكل

او بأستطاعتك العمل على احد البرناج المساعدة مثل Benthic او غيرها من البرامج

وانا على الاستعداد اختي الفاضلة لأي استفسار .

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

السلام عليكم ورحمة الله وبركاته

أخواني وأخواتي الاعزاء قلنا في الدرس السابق سنتحدث عن علاقة اولاد العمومة ((( العائلة )))

علاقة اولاد العم الـــــProcedure والـــــFunction .

بسم الله نبدء ......


مقدمة بسيطة....

بعد تعرفنا على اولاد العم يجب هنالك تنظيم لاولاد العم ومعرفة كل واحد لأي عائلة ينتمي .

مثال بسيط للتوضيح :عندي مجموعة من الاسماء كالتالي :

1) احمد الوزني 2) فيصل عصفور 3) ايمن الوزني

4)محمد البشيتي 5)محمود الوزني 6) احمد البشيتي

7) حمزة عصفور 8) عمر البشيتي 9)عبدالله عصفور

10) زاهد عصفور 11)حسن البشيتي

كما لاحظنا الاسماء مختلفة ولكن اسماء العائلات مكررة .

لنقوم بعملية تنظيم نفرز هذه الاسماء من خلال أسماء العائلات .

اولا عندي اسماء 3 عائلات وهي الوزني والبشيتي و عصفور .

والتنظيم كالتالي .

1) الوزني (احمد , أيمن , محمود ) .

2) البشيتي (عمر, احمد , محمد ,حسين).

3 ) عصفور (فيصل,حمزة ,عبدالله , زاهد).

اذا الموضوع بسيط رتبنا الاسماء بالترتيب حسب اسم العائلة .

مثال بسيط أخر : عندي عدد معين من الافراد وكل فرد من عائلة وأريد ان أوزع مهام لكل فرد حسب العائلة

لانه كل عائلة مشهورة بشيئ معين فمثلا العائلة ص مشهورة بالحسابات والعائلة س مشهورة بجمع المال

والعائلة ك مشهورة بحمل الاثقال والعائلة م مشهورة بالبناء ....وهكذا


وبالنفس المفهوم عندنا في الـــProcedure والـــFunction اذا يوجد مجموعة كبيرة من العائلات

ومن هذه العائلات على سبيل المثال .

1 ) المالية .

ويوجد في هذه العائلة مجموعة من اولاد العم ((( Procedure و Function )))

أ ) حسابات الموردين.

ب ) حسابات العملاء .

ج ) الاصول الثابتة .

د ) دليل الحسابات .

ه ) الاوراق البنكية .

وغيرهم من الــــProcedure والــFunction .

2 ) الموارد البشرية HR .

ويوجد في هذه العائلة مجموعة من اولاد العم ((( Procedure و Function )))

أ ) التدريب .

ب ) احتسابات الرواتب .

ج ) احتسابات الاجازات والمغادرات .

د ) احتساب الدوام الاضافي .

ه ) الحضور والانصراف .

وغيرهم من الــــProcedure والــFunction .

3 ) ادارة سلسلة الامدادات.

ويوجد في هذه العائلة مجموعة من اولاد العم ((( Procedure و Function )))

أ ) SCM المخزون .

ب ) متابعة الموردين .

ج ) ادخال الاوامر .

د ) المشتريات .

وغيرهم من الــــProcedure والــFunction .

ويوجد الكثير من العائلات ( المخازن , الحسابات , الموارد البشرية ....الخ)

اذا انا بأختصار شديد يجب ان اضع كل الــFunction والـــProcedure الخاصة بمهام معينة في عائلة واحدة بأسم مميز.

يعني عائلة المحاسبة يوجد فيها فقط الــFunction والــProcedure الخاصة بالمحاسبة فقط .

وعائلة المبيعات يوجد فيها فقط الــFunction والــProcedure الخاصة بالمبيعات فقط .

وعائلة المشتريات يوجد فيها فقط الــFunction والــProcedure الخاصة المشتريات فقط .

وهكذا ....

طيب في النهاية اكيد اوراكل عرفت هذه العائلة بتعريف معين .

اتدرون بماذا تعرف هذه العائلة في اوراكل .

انه الـــــــــــــPackage وفي السابق عرفنا الــPackage .

وهنالك تعريف اخر للـــPackage وهو عبارة عن عملية تنظيمية ينظم عمل الــProcedure والــFunction .

الان سنشرح كيفك كتابة الــPackage .

بسم الله نبدء .

اول شي يجب معرفته الـــPackage يكتب على خطوتين .


الخطوة الاولى وهي الـــCreate Specification وتحتوي على الــHeder .

الخطوة الثانية وهي الـــCreate Body .

كيفية كتابة الخطوة الاولى .........

كتابة اسماء الــProcedure والـــFunction مع تمرير البراميتر في حالة وجود البراميتر .


Create Or Replace Package Package_Name Is
Procedure_Name(P1 In Number,P2 Out Number,.......);
Procedure_Name(P1 In Out Varchar2);
Function_Name(P1 In Varchar2)
Return Varchar2;				 
End;



كيفية كتابة الخطوة الثانية .........

كتابة اسماء الــProcedure والـــFunction مع كتابة محتوى الــProcedure والــFunction كاملا .


Create Or Replace Package Body Package_Name Is
Procedure_Name(P1 In Number,P2 Out Number,.......)
هنا نكتب محتوى الــProcedure كاملا 
.
.
.
End Procedure_Name; 
Procedure_Name(P1 In Out Varchar2)
هنا نكتب محتوى الــProcedure كاملا 
.
.
.
End Procedure_Name;
Function_Name(P1 In Varchar2)
Return Varchar2
is
هنا نكتب محتوى الـــFunction  كاملا
.
.
.				 
End Function_Name;

End .  نهايـــة الـــــــPackage



الان سنكتب مثال على الــPackage .

بسم الله نبدء .

اريد ان اكتب باكج يحتوي على Procedure يحسب ناتج جمع رقمين وProcedure اعطيه رقم موظف

ويعطيني اسمه مع راتبه واريد ان اكتب Function اعطيه رقم القسم ويعطيني اسم القسم .


الجزء الاولى .


SQL> SET SERVEROUTPUT ON
SQL> SET VERIFY OFF
SQL> CREATE OR REPLACE PACKAGE MY_PACK IS
 2  PROCEDURE CAL(P_NO1 IN  NUMBER,P_NO2 IN NUMBER);
 3  procedure p_emp(p_empno in number);
 4  FUNCTION F_DEPT(p_deptno  in number)
 5  RETURN VARCHAR2;
 6  END;
 7  /

Package created.



الخطوة الثانية .


SQL>  CREATE OR REPLACE PACKAGE BODY MY_PACK IS
 2  PROCEDURE CAL(P_NO1 IN  NUMBER,P_NO2 IN NUMBER)
 3  IS
 4  V NUMBER;
 5  BEGIN
 6  V:=P_NO1+P_NO2;
 7  DBMS_OUTPUT.PUT_LINE('SUM  ='||V);
 8  END CAL;
 9  procedure p_emp(p_empno in number)
10   is
11   cursor c is
12   select *
13   from emp
14   where empno=p_empno;
15   x c%rowtype;
16   begin
17   open c;
18   fetch c
19   into x;
20   if c%notfound then
21   dbms_output.put_line('No Data found ....');
22   end if;
23   dbms_output.put_line('Name  '||x.ename||' Salary '||x.sal);
24   close c;
25  END P_EMP;
26  FUNCTION F_DEPT(p_deptno  in number)
27   return varchar2
28   is
29  v_name varchar2(50);
30  begin
31  select  dname
32  into v_name
33  from  dept
34  where deptno=p_deptno;
35  dbms_output.put_line('Name  Dpet '||v_name);
36  exception
37  when  no_data_found then
38  dbms_output.put_line('No Data found ....');
39  return  v_name;
40  END F_DEPT;
41  END;
42  /

Package body created.




الان نقوم بأستدعاء الــProcedure والـــFunction عن طريق الـــــــPackage .

كالتالي ..............

سنقوم بأستدعاء الـــProcedure الخاص بــعملية جمع رقمين .

SQL> BEGIN
 2  MY_PACK.CAL(&P_NO1,&P_NO2);
 3  END;
 4  /
Enter value for p_no1: 50
Enter value for p_no2: 80
SUM =130

PL/SQL procedure successfully completed.



سنقوم بأستدعاء الـــProcedure الخاص بأسم وراتب الموظف .


SQL> BEGIN
 2  MY_PACK.P_EMP(&P_EMP);
 3  END;
 4  /
Enter value for p_emp: 7900
Name  JAMES Salary 950

PL/SQL procedure successfully completed.



سنقوم بأستدعاء الـــFunction الخاص بأسم القسم .

SQL> DECLARE
 2  V_DNAME VARCHAR2(100);
 3  BEGIN
 4  V_DNAME:=MY_PACK.F_DEPT(&P_DEPTNO);
 5  END;
 6  /
Enter value for p_deptno: 10
Name  Dpet ACCOUNTING



كلام جميل جدااااااااااااااا وجميع الــProcedure والــFunction اشتغلت عن طريق الــPackage .

طيب في حالة ما عرفنا الــProcedure او الــFunction في مرحلة الثانية الــBody وما عرفناه في المرحلة الاولى Specification

هل نستطيع استخدام هذا الــProcedure او الــFunction من خلال الــPackage .

لنر هذا المثال .


SQL> SET SERVEROUTPUT ON
SQL> SET VERIFY OFF
SQL> CREATE OR REPLACE PACKAGE MY_PACK IS
 2  PROCEDURE CAL(P_NO1 IN  NUMBER,P_NO2 IN NUMBER);
 3  procedure p_emp(p_empno in number);
 4  FUNCTION F_DEPT(p_deptno  in number)
 5  RETURN VARCHAR2;
 6  END;
 7  /

Package created.



SQL>  CREATE OR REPLACE PACKAGE BODY MY_PACK IS
2  PROCEDURE PRINT(P_TEXT IN  VARCHAR2)
3  IS
4  BEGIN
5  DBMS_OUTPUT.PUT_LINE(P_TEXT);
6  END;
7	 PROCEDURE CAL(P_NO1 IN  NUMBER,P_NO2 IN NUMBER)
8	 IS
9	  V NUMBER;
10	  BEGIN
11	 V:=P_NO1+P_NO2;
12	 DBMS_OUTPUT.PUT_LINE('SUM  ='||V);
13	 END CAL;
14	procedure p_emp(p_empno in number)
15	  is
16	   cursor c is
17	 select *
18	   from emp
19	  where empno=p_empno;
20	   x c%rowtype;
21	   begin
22	  open c;
23	  fetch c
24	   into x;
25	   if c%notfound then
26	  dbms_output.put_line('No Data found ....');
27	  end if;
28	  dbms_output.put_line('Name  '||x.ename||' Salary '||x.sal);
29	  close c;
30	 END P_EMP;
31	 FUNCTION F_DEPT(p_deptno  in number)
32	  return varchar2
33	  is
34	 v_name varchar2(50);
35	 begin
36	 select  dname
37	 into v_name
38	 from  dept
39	 where deptno=p_deptno;
40	 dbms_output.put_line('Name  Dpet '||v_name);
41	 exception
42	 when  no_data_found then
43	 dbms_output.put_line('No Data found ....');
44	 return  v_name;
45	 END F_DEPT;
46*	END;
47  /

ackage body created.



سنجرب كتابة نفس الامثلة السابقة كالتالي .


SQL> BEGIN
 2  MY_PACK.P_EMP(&P_EMP);
 3  END;
 4  /
Enter value for p_emp: 7900
Name  JAMES Salary 950

PL/SQL procedure successfully completed.
-------------------------------------
SQL> DECLARE
 2  V_DNAME VARCHAR2(100);
 3  BEGIN
 4  V_DNAME:=MY_PACK.F_DEPT(&P_DEPTNO);
 5  END;
 6  /
Enter value for p_deptno: 10
Name  Dpet ACCOUNTING

PL/SQL procedure successfully completed.
--------------------------------
SQL> BEGIN
 2  MY_PACK.CAL(&P_NO1,&P_NO2);
 3  END;
 4  /
Enter value for p_no1: 50
Enter value for p_no2: 80
SUM =130

PL/SQL procedure successfully completed.



كلام جميل جداااااااااا اعطاني النتيجة المطلوبة .

طيب الان لنجرب الــProcedure الجديد الذي عرفناه فقط في الـــBody .

اول مرة سأجرب تطبيق هذا الــProcedure لوحده لاني بالاصل كاتبه قبل الــPackage .

لنرى ...........


SQL> BEGIN
 2  PRINT('HOW ARE YOU ...?');
 3  END;
 4  /
HOW ARE YOU ...?

PL/SQL procedure successfully completed.



تم المطلوب بشكل صحيح .

الان اريد استدعاء الــProcedure عن طريق الــPackage لنرى النتيجة .


SQL> BEGIN
 2  MY_PACK .PRINT('HOW ARE YOU ...?');
 3  END;
 4  /

BEGIN
*
ERROR at line 1:
ORA-06550: line 2, column 4:
PLS-00302: component 'PRINT' must be declared
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored




طلع لنا Erorr وهذا كلام صحيح في حالة كتابة الــProcedure او الــFunction في الــBody

وعدم تعريفه في الــSpicifcation لا نستطيع التعامل معه الا داخل الــPackage فقط .

والان سأقوم بالتعامل مع الـــProcedure الخاص بعملية الــPrint داخل الـ Package كالتالي .


SQL> ed
Wrote file afiedt.buf

 1  CREATE OR REPLACE PACKAGE BODY MY_PACK IS
 2  PROCEDURE PRINT(P_TEXT IN  VARCHAR2)
 3  IS
 4  BEGIN
 5  DBMS_OUTPUT.PUT_LINE(P_TEXT);
 6  END;
 7	 PROCEDURE CAL(P_NO1 IN  NUMBER,P_NO2 IN NUMBER)
 8	 IS
 9	  V NUMBER;
10	  BEGIN
11	 V:=P_NO1+P_NO2;
12	 print('SUM  ='||V);
13	 END CAL;
14	procedure p_emp(p_empno in number)
15	  is
16	   cursor c is
17	 select *
18	   from emp
19	  where empno=p_empno;
20	   x c%rowtype;
21	   begin
22	  open c;
23	  fetch c
24	   into x;
25	   if c%notfound then
26	  print('No Data found ....');
27	  end if;
28	  print('Name  '||x.ename||' Salary '||x.sal);
29	  close c;
30	 END P_EMP;
31	 FUNCTION F_DEPT(p_deptno  in number)
32	  return varchar2
33	  is
34	 v_name varchar2(50);
35	 begin
36	 select  dname
37	 into v_name
38	 from  dept
39	 where deptno=p_deptno;
40	 print('Name  Dpet '||v_name);
41	 exception
42	 when  no_data_found then
43	 print('No Data found ....');
44	 return  v_name;
45	 END F_DEPT;
46*	END;
SQL> /

Package body created.



سنقوم بعملية استدعاء الــProcedure والــFunction مرة اخرى لنرى هل الــPrint اشتغلت ام لا .


SQL> BEGIN
 2  MY_PACK.P_EMP(&P_EMP);
 3  END;
 4  /
Enter value for p_emp: 7900
Name  JAMES Salary 950

PL/SQL procedure successfully completed.
-------------------------------------
SQL> DECLARE
 2  V_DNAME VARCHAR2(100);
 3  BEGIN
 4  V_DNAME:=MY_PACK.F_DEPT(&P_DEPTNO);
 5  END;
 6  /
Enter value for p_deptno: 10
Name  Dpet ACCOUNTING

PL/SQL procedure successfully completed.
--------------------------------
SQL> BEGIN
 2  MY_PACK.CAL(&P_NO1,&P_NO2);
 3  END;
 4  /
Enter value for p_no1: 50
Enter value for p_no2: 80
SUM =130

PL/SQL procedure successfully completed.



الحمدلله اشتغلت الــPrint .

إن شاء الله اذا لم يكن هنالك اسئلة سنكمل بأذن الله اخر درس في دروس الـــPL/SQL .

أتمنى ان اكون قد اوصلت معلومة صحيحة وبشكل سهل .

نلتقي في الدرس القادم بأذن الله .

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

السلام عليكم ورحمة الله

اخى الفاضل

جهد متميز ... من عضو متميز

شكرا لك على الاسلوب المبسط فى الشرح

شكرا لك على الجهد المبذول

شكرا لك على الاستمرار وحب العطاء


جزاك الله خيرا

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

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

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

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

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

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

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

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