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)
)
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
(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
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