Firebird - Kategori ağacı sorgulaması [Hazır Kod]

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
onaydin

Firebird - Kategori ağacı sorgulaması [Hazır Kod]

Mesaj gönderen onaydin »

Kategori ağacı sorgulaması;

Fahrettin bey’in seminerde anlattığı alt kategori listesinin alınması ile ilgili sql in Firebird versiyonu.
Tablo yapısı;

Kod: Tümünü seç

 
TABLE URUN
(
  URUN_NO                  INTEGER         NOT NULL,
  AD                       VARCHAR(    30) NOT NULL COLLATE WIN1254,
  URUN_UST_NO              INTEGER,
  CONSTRAINT PK_URUN PRIMARY KEY (URUN_NO)		
)
Tablo üzerinde bir tane foreign key tanımlı

Kod: Tümünü seç

ALTER TABLE URUN ADD CONSTRAINT FK_URUN_URUN
  FOREIGN KEY (URUN_UST_NO) REFERENCES URUN
  (URUN_NO)
  ON DELETE NO ACTION
  ON UPDATE CASCADE;

Seminerdeki fonksiyon

Kod: Tümünü seç

CREATE PROCEDURE P_UST_SEVIYELERDE_VARMI (
  URUN_NO Integer,
  ARANAN_URUN_NO Integer)
 returns (
  SONUC SmallInt)
AS
declare variable URUN_UST_NO integer;
begin
  SONUC = 0;
  select URUN_UST_NO from URUN where URUN_NO = :URUN_NO into :URUN_UST_NO;
  while (URUN_UST_NO is not null and URUN_UST_NO <> URUN_NO and URUN_UST_NO <> ARANAN_URUN_NO) DO
   BEGIN
    select URUN_UST_NO from URUN where URUN_NO = :URUN_UST_NO into :URUN_UST_NO ;
   END
  if(URUN_UST_NO = ARANAN_URUN_NO or ARANAN_URUN_NO = URUN_NO) THEN
   BEGIN
    SONUC = 1;
   END
   ELSE
   BEGIN
    SONUC = 0;
   END

   SUSPEND;
end
Firebird için buraya kadarı yetmedi
(select teki alanı procedure ün içinde göremedi- ya da beceremedik)

Bir tane ek procedure daha ekliyoruz

Kod: Tümünü seç

CREATE PROCEDURE P_ALT_LISTE (
  ARANAN_NO Integer)
 returns (
  URUN_NO Integer)
AS
declare variable TMP_URUN_NO integer;
declare variable SONUC smallint;
begin
   for select URUN_NO from URUN where URUN_NO <> :ARANAN_NO into TMP_URUN_NO do
    begin
      EXECUTE PROCEDURE P_UST_SEVIYELERDE_VARMI(:TMP_URUN_NO,:ARANAN_NO)
              RETURNING_VALUES (:SONUC);
     if(SONUC = 1)THEN
      begin
       URUN_NO = TMP_URUN_NO;
      suspend;
      end

    end

end
denemedim ama iki procedure ü tek bir procedure haline getirmek mümkün duruyor.
Neden denenmedi;
Kayıt eklenirken kısır döngü olmasın diye
Mesela (
-Eşya
-Beyaz Eşya
- Buzdolabı
- Eşya)
Urun tablosunun before update inde bir trigger tanımlı yalın olan ilk procedure ü kullanıyor;

Kod: Tümünü seç

CREATE TRIGGER URUN_B_UPDATE FOR URUN ACTIVE BEFORE UPDATE POSITION 0 AS
declare variable sonuc smallint;
begin
 select SONUC from P_UST_SEVIYELERDE_VARMI (new.URUN_UST_NO,new.URUN_NO)
  into :sonuc;
  if(sonuc = 1) then
   EXCEPTION KISIR_DONGU 'Seçtiğiniz üst kategori zaten ' ||
        new.AD ||' kategorisinin altında yer alıyor' ;
end
Cevapla