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

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

صورة
- - - - -

مشكلة في انشاء primary_key


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

#1 أبي مجيد

أبي مجيد

    مشترك

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

تاريخ المشاركة 27 January 2005 - 08:16 PM

السلام عليكم ورحمه الله وبركاته
اخواني انا اسف لتضيع وقتكم في مشاكلي ولكني اسأل الله ان يبدلكم نورا
ولكني لدي مشكلة في انشاء primary_key ولا اريد استخدام الـ sequence لاني لو مسحت احد الحقول فسوف يحصل gap ولست بحاجة لهذا ولا اعرف اذا كان ما اقوله صحيح ام خطأ وارجو منكم ان تبلغوني اذا كان كلامي خاطئا .
لهذا استعنت بالـ rownum ولكن المشكلة انه لا يستجيب الا للقيد الاول ويهمل باقي القيود وكانه غير موجود .
فهل المشكلة في النسخة التي نصبتها في الجهاز ام ان العيب في انا,
وهذه نسخة عن البرنامج الذي تحدث فيه المشكلة
> create or replace procedure primary_key
2 is
3 nou inter.id11%type:=0;
4 begin
5 select count(*) into nou
6 from inter;
7 for i in 1..nou loop
8 update inter
9 set id11=i
10 where rownum=i;
11 end loop;
12 end primary_key;


وحتى لو قمت بالعمل من دون procedure فان المشكلة نفسها تواجهني
update inter
set id11=2
where rownum=2
هل هذه مشكلتي وحدي ام انها حدثت معكم .
فانا اليوم التمس من اخوتي المساعدة فهل من مجيب
والسلام عليكم ورحمة الله وبركاته ........


E_mail:ubay_s@yahoo.com

#2 Osama Soliman

Osama Soliman

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

  • المجموعة الماسية
  • 1,611 مشاركة
  • الاسم الأول:Osama
  • اسم العائلة:Soliman
  • البـلـد: Country Flag
  • المنصب الحالي:Oracle Technical Consultant - Asfour Crystal International

تاريخ المشاركة 27 January 2005 - 11:13 PM

اخى ابى المجيد
السلام عليكم ورحمة الله وبركاته
والسلام على اهل العراق جميعاً من الموصل حتى البصرة

واليك الحل التالى :

بافتراض ان الجدول Employees به الحقل emp_id
ويوجد نموذج به حقول هذا الجدول
يمكنك اخى استخدام الكود التالى فى Pre-Insert Trigger

SELECTNVL(MAX(emp_id),0) +1
INTO :emp_id ;from employees

وهذا يعمل على زيادة كود الموظف بمقدار واحد مع حدوث الفجوة فى التسلسل

ولك تحياتى
اسامه سليمان
القاهرة

وقل رب زدنى علماً
Osama M. Soliman
Oracle Certified Professional
Oracle Technical Consultant

 Asfour Crystal International
Cairo - Egypt
Osama.Soliman@hotmail.com
Osama.Soliman@asfourcystal.com


#3 hussien.fawzy

hussien.fawzy

    عضو

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

تاريخ المشاركة 29 January 2005 - 04:22 PM

Dear Questionaire
FIRST , u cant put such condtion rownum = x unless x = 1 ( it's a logic think about it, rownum holds the count of the returned rows )
SECOND to do it in ur way , u have to use cursor and select for update , and update where current of cursor
i.e
CREATE OR REPLACE PROCEDURE PRIMARY_KEY IS
NOU number := 1;
CURSOR EMP_CUR IS
SELECT *
FROM EMPS
ORDER BY WHAT_EVER_U_WANT
FOR UPDATE ;
BEGIN

FOR REC IN EMP_CUR
LOOP
UPDATE EMPS SET ID = NOU
WHERE CURRENT OF EMP_CUR ;
NOU := NOU + 1 ;
END LOOP;
COMMIT ;
END PRIMARY_KEY;

THIRD
u said u wanna to avoid gaps ! but the code u write not avoid gaps upon delete
cause it just creates a filed to be a sequanced primary key in.
but after that any one can delete making the gaps that you wanna avoid
so first let me ask u something , y u want avoid gaps ?
u may want avoid gaps in a meaningfull field .. but one of the rules of the PK says " PK should be meaningless "

Huss.