26 Eylül 2011 Pazartesi

ORACLE RECURSIVE QUERY CONNECT BY PRIOR

Örnek
ust_mal_id tablodaki başka bir kayıdı (id’yi) göstersin (seviye mal tablosu üzerindeki bir alandır. En üst seviye=1 dir ve seviye=1 olan kayıtların ust_mal_id değeri bostur).

SELECT seviye,id, ust_mal_id
FROM mal
CONNECT BY PRIOR ust_mal_id=id
START WITH ID = 25909
ORDER BY SEVIYE DESC

ÇIKTI
SEVIYE      ID    UST_MAL_ID
3           25909 24916
2           24916 25051
1           25051


Bir Function Yazarak Bu Sorguyu Program içinden kullanabiliriz

/* Formatted on 26.09.2011 15:59:27 (QP5 v5.149.1003.31008) */
CREATE OR REPLACE FUNCTION "MAL_USTMALIDLERI_BIRLESTIR" (P_MAL_ID IN NUMBER)
   RETURN VARCHAR2
IS
   CURSOR C1
   IS
          SELECT seviye, id, ust_mal_id
            FROM mal
      CONNECT BY PRIOR ust_mal_id = id
      START WITH ID = P_MAL_ID
        ORDER BY SEVIYE DESC;

   V_MAL_IDLER   VARCHAR2 (100);
BEGIN
   V_MAL_IDLER := '';

   FOR C1REC IN C1
   LOOP
      V_MAL_IDLER := V_MAL_IDLER  || C1REC.ID || ';';
   END LOOP;

   RETURN V_MAL_IDLER;
END MAL_USTMALIDLERI_BIRLESTIR;

Grant
DBMS_UTILITY.EXEC_DDL_STATEMENT('grant execute on MAL_USTMALIDLERI_BIRLESTIR to vtuser');

Kullanım
SELECT MAL_USTMALIDLERI_BIRLESTIR(25909) FROM DUAL;

ÇIKTI
25909;24916;25051;

Hiç yorum yok:

Yorum Gönder