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

متغيرات من نوع كائن


MMA

Recommended Posts

بسم الله الرحمن الرحيم

أصدقائي أعضاء المنتدي الكرام /
كل عام وأنتم بخير بمناسبة حلول شهر رمضان الكريم

في الحقيقة أنا عندي مشكلة قد طرحتها في هذا المنتدي من قبل ولم أحد
يستجيب لي ، حيث إنها المشاركة الثانية بالنسبة لي :


السؤال هو ؟

كيف يتم تعريف متغير داخل PL/SQL أو Parameter من نوع كائن Object ،
أنظر الكود التالي:
-----------------------------------------------
Create Or Replace Function XX(A Table)
As
X VarChar2(20);
Y Table;
R View;
Begin

End;
-----------------------------------------------
هل يمكـن جعل متغير مثل Y من نوع جدول ، أو متغير مثل R من نوع عارض
أو ------ الي آخرة داخل أوراكل ، فالكود مستنتج من SQL-Server وغير
صحيح.

فإذا كانت الإجابة بنعم ، ما هي الطريقة

مع العلم أنني قد سمعت أن SQL-Server له القدرة علي هذا الأمر

========== مع الشكر

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

أخي Amgad ، تحية طيبة وبعد ،


في الحقيقة أنا تعاملت مع مثل هذا الموضوع ، ولكن سؤالي واضح ، ومن المثال التالي يمكن التوضيح أكثر :
------------------------------------------------------------------------

نفترض أن لدينا جدولين بهما أربعة حقول من نفس النوع ونفس الإسم ، علي النحو التالي
Enumber --> رقم الموظف
Fname --> إسم أول
Mname --> إسم أوسط
Lname --> إسم أخير


Create Or Replace Function Link_Field(TableName Table,ID_Num VarChar2) Return VarChar2
As
Type m_Record As Record
(
ID_Fname VarChar2(20),
ID_Mname VarChar2(20),
ID_Lname VarChar2(30)
);
lenRecord m_Record;
o_Name VarChar2(70);
Begin
Select Fname,Mname,Lname
Into lenRecord
From TableName
Where Enumber = ID_Num;
o_Name := lenRecord.ID_Fname || ' ' || lenRecord.ID_Mname || lenRecord.ID_Lname;

Reruen o_Name;
End XX;
/

إستدعاء البرنامج :

Select LNKF(Emp,Enumber) As Ename From Emp;

Select LNKF(EMP_1,Enumber) As Ename From Emp_1;

-------------------------------------

لاحظ أن هذا الكود غير سليم ، ولكن هو تخيلي لكيفية إقتباس أكثر من جدول داخل Parameters لإحدي الإجراءات أو الأغراض ، وهو أيضاً ما أرغب فية.





وشكراُ علي ردك أخي الكريم

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

  • بعد 1 شهر...

I did not understand you very will,
but
if you are trying to pass the table name throght a parameter to be used in the from clouse
so you are talking about dinamic sql search DBMS_SQL pacakge
but
if you are trying to pass a tabe data you souhd create an index by parameter.
i hope that helped you.

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

  • بعد 1 شهر...

اخي العزيز ..........
اذا كان قصدك عمل متغير من نوع جدول .......
-----------------------------------------------------------------------------------
V_Emp Emp%RowType ;
الان يمكن استخدام V_Emp بدلاً من استخدام الجدول نفسه
V_Emp.ename
V_Emp.sal
V_Emp.Deptno

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

أخي الكريم

أشكرك كثيراً علي الرد


بالفعل ، هذا الأمر ( V_Emp Emp%RowType ) سيحل لي الكثير من المشاكل


ولكن أخي الكريم أنظر معي ، المتغير خاص بجدول Emp فقط لا غير ، بمعني أنني سأستخدم هذا المتغير للتعامل مع
الكائن ( Emp ) ، ولكنني أرغب في متغير يمكن تحميل العديد من الكائنات به مثل :
Dep
Emp
Phone
Pro ------- الي آخرة


وأشكرك كثيراً علي هذه المعلومة الجميلة


وآسف علي التأخري للرد عليك

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

اليك هذا المثال لعله يفيدك

set serveroutput on
show errors
declare
vsex char(1):='&sex'; 
type emp_rec is record(eno emp.empno %type,ename emp.ename %type,sex emp.sex %type,
								  salary emp.sal %type,hiredate emp.hiredate %type,yearsofservice number(5,2));
type emp_table is table of emp_rec;
emp_col emp_table:=emp_table();
cursor c_emp is select empno,ename,sex,sal,hiredate,((sysdate-hiredate)/365) 
						from emp where sex=vsex order by sal desc;
cele integer;
m integer;
temp number(5,2):=0;
begin
emp_col.extend(4);
for rec in c_emp loop
emp_col(c_emp %rowcount):=rec;
exit when c_emp %rowcount >=4;
end loop;
cele:=emp_col.first;
for i in 1..emp_col.count loop
dbms_output.put_line('element ' || cele || ' is number:' || emp_col(cele).eno || ' name:' ||emp_col(cele).ename || 
				  ' sex :' || emp_col(cele).sex || ' salary:' || emp_col(cele).salary || ' hiredate:' || emp_col(cele).hiredate || 
				  ' years of service:' || emp_col(cele).yearsofservice);
cele:= emp_col.next(cele);
end loop;
cele:=emp_col.first;
for j in 1..emp_col.count loop
if temp < emp_col(cele).yearsofservice then
m:=cele;
temp:=emp_col(cele).yearsofservice;
end if;
cele:= emp_col.next(cele);
end loop;
cele:=m;
emp_col.delete(cele);
cele:=emp_col.first;
for i in 1..emp_col.count loop
dbms_output.put_line('element ' || cele || ' is number:' || emp_col(cele).eno || ' name:' ||emp_col(cele).ename || 
				   ' sex :' || emp_col(cele).sex || ' salary:' || emp_col(cele).salary || ' hiredate:' || emp_col(cele).hiredate ||
				   ' years of service:' || emp_col(cele).yearsofservice);
cele:= emp_col.next(cele);
end loop;
end;

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

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

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

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

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

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

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

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