Konuyu görüntüle
IUCODERS FORUM > Programlama > Veritabanları > Rekürsif Stored Procedure
Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
22.07.2009-16:29 #62664
ID, ADMIN_ID gibi iki değişkeni olan bir tablom olsun. 1-n şeklinde ağaç olarak bir hiyerarşi var. Ben bir kişinin id sini parametre alarak onun altında çalışanları ve çalışanların çalışanlar... tüm ağacı görmek istiyorum. Rekürsif bi yapı kullanmalıyım sanırım, nasıl yapabilrimconfused





The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
22.07.2009-16:53 #62665
2. Olarakta resimdeki yapıya göre.

Bir kişinin PERS_Id sini parametre alıp o kişi için
ITEM_Name,ITEM_Rendered,ITEM_Disabled değerlerini bana listeleyen bir sorguya ihtiyacım var.
Bir kişinin birden fazla rolü bir rolün birden fazla fonksyonu olduğu için aynı ITEM'a farklı izinlerde sahip olabilir. Bu ITEM ler gruplamalıyım sanırım ama rendered bool değerleri or lanmalı ve disabled değerler and lenmeli. Bunu nasıl yapabilirimconfused







The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
22.07.2009-21:51 #62672
sonucta stored procedure in ve out parametreleri alabilir. bir while dongusu içerisinde proceduru tekrar tekrar çalıştırıp in out parametrelerini kontrol edebilirsin.





N/A
Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
22.07.2009-21:53 #62673
script ve sample data verbakalım





N/A
Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
22.07.2009-23:11 #62675
Henüz verileri oluşturmadım. Oluşturunca yazarım tekrar.





The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
tatanga


avatar

Kayıt: 13.10.2006
23.07.2009-10:44 #62682
eğer sql 2005 kullanacaksan bir sp'yi rekürsif olarak max. 32 kere çağırabilirsin.
Select @@NestLevel ile bulunduğun dallanmayı öğrenip 32 ise kaldığın yerden devam edebilecek farklı isimli bir sp çağırabilirsin.

bunun yerine sana şöyle bi yapı öneririm;
çalışan tablosunu id, parentid, relation şeklinde tanımla,
en tepede yer alacak kaydın relation alanını 1,
onun altında çalışan ilk kişinin relation alanı 1-1,
ikinci kişinin relation alanı 1-2, üçünü 1-3 .. şeklinde devam ettir.
1-1 relationlı çalışanın altında çalışan ilk elemanın relation alanı da 1-1-1, ikinci 1-1-2.. şeklinde devam ettir.
1-1 relation alanına sahip elemanın altında çalışanları bulmak için
select * from xx where relation like '1-1-%' komutunu vermen yeterli.
direkt ona bağlı olanlar için de parentid den sorgularsın.





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
23.07.2009-11:12 #62683
Şöyle bir yapı denedim ama çalıştıramadımd oh Daha doğrusu istediğim sonucu alamadım. Burda 100 defadan fazla kendini çağırmıyor fonksyon. Benim tabloda binlerce çalışan olacak. Bu sayılarla oynama şansım varmı?

Bide oracle da Connect by prior die bişey varmış ms sql de niye yokkidrooling

tatanga yazdi
 

Böyle bir yapıyı son çare olarak kullanabilrim belki.

USE HR_Dbase;
GO
WITH HR_Employe (EMPL_Administrator, EMPL_Id)
AS
(
-- Anchor member definition
    SELECT e.EMPL_Administrator, e.EMPL_Id
       
    FROM HR_Employee AS e 
    
    UNION ALL
-- Recursive member definition
    SELECT e.EMPL_Administrator, e.EMPL_Id       
    FROM HR_Employee AS e 
    
    INNER JOIN HR_Employee AS d
        ON e.EMPL_Administrator = d.EMPL_Id
)
-- Statement that executes the CTE
SELECT *
FROM HR_Employe  WHERE EMPL_Id = 832


GO






The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
23.07.2009-11:19 #62684
Böyle yaptım oldubiggrin

WITH n(EMPL_Id, EMPL_Adnisitrator) AS 
   (SELECT EMPL_Id, EMPL_Administrator 
    FROM HR_Employee
    WHERE EMPL_Id = 832
        UNION ALL
    SELECT nplus1.EMPL_Id, nplus1.EMPL_Administrator
    FROM HR_Employee as nplus1, n
    WHERE n.EMPL_Id = nplus1.EMPL_Administrator)
SELECT * FROM n






The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb