INTERBASE TE PROCEDURE VE TRIGGER ÇALIŞTIRAMAMA

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
goksenin
Üye
Mesajlar: 37
Kayıt: 04 Ara 2003 11:59
İletişim:

INTERBASE TE PROCEDURE VE TRIGGER ÇALIŞTIRAMAMA

Mesaj gönderen goksenin »

Selamunalykum.
Interbase 'te procedure oluşturuyorum bunuda gerekli table ın after insert ınde çalıştırmayı deniyorum. Ancak yazdığım procedure içinde variable da tanımladığım değişkenleri output a alırsam IB Expert in adım adım çalıştırma olayında herşey istediğim gibi oluyor ancak bunu trigger içinden tetiklersem hem procedure çalışmıyor hemde bu table ı açıp verilerine ulaşamıyorum bu da zannedersem değişkenlerin outputta olamasından kaynaklanıyor ancak değişkenleri variable aldığımda da ise after insert olayında çalıştırabiliyorum hem tableın datalarınada ulaşıyorum ve IB Expert içinde adım adım çalıştırıyorum olayı oldu gibi gösteriyor ancak gerekli tablelara insertu gerçekleştirmiyor...

Kullandığım metodlarda mı sorun var anlamadım...Hem Interbase helpinden hemde sitemizdeki yardımları da inceliyorum bir hata gözükmüyor...

ACİLL olarak bunun çözümüne ihtiyacım var...

Yazdığım PROCEDURE ve onu çağırdığım AFTER INSERT TRIGGER I altta...

*************************************************************CREATE PROCEDURE DETAYLARINI_OLUSTUR (
IN_O_EOYILI CHAR(9),
IN_O_OGRENCI_NO CHAR(10))
AS
DECLARE VARIABLE SKS_SORU_NO SMALLINT;
DECLARE VARIABLE CDS_SORU_NO SMALLINT;
BEGIN

/*SK DETAYLARINI OLUŞTURUYOR*/
FOR
SELECT SKS_SORU_NO
FROM SKS
INTO :SKS_SORU_NO
DO
BEGIN

INSERT INTO SKD (SKD_OGRENCI_NO, SKD_EOYILI, SKD_SORU_NO, SKD_CEVAP)
VALUES (:IN_O_OGRENCI_NO,:IN_O_EOYILI,:SKS_SORU_NO , '');
SUSPEND;

END

/*ÇD DETAYLARINI OLUŞTURUYOR*/
FOR
SELECT CDS_SORU_NO
FROM CDS
INTO :CDS_SORU_NO

DO
BEGIN
INSERT INTO CDD ( CDD_OGRENCI_NO, CDD_EOYILI, CDD_SORU_NO, CDD_CEVAP)
VALUES (:IN_O_OGRENCI_NO,:IN_O_EOYILI,:CDS_SORU_NO , '');

SUSPEND;

END
END
*************************************************************
CREATE TRIGGER OGRENCI_BILGILERI_AI0 FOR OGRENCI_BILGILERI
ACTIVE AFTER INSERT POSITION 0
AS
begin
execute procedure detaylarini_olustur(NEW.o_eoyili,NEW.o_ogrenci_no);
end
*************************************************************

TRIGGER ve PROCEDURE yazma ile ilgili bildiklerinizi de paylaşırsanız sevinirim ....
Hayırlı Çalışmalar.
Göksenin.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Interbase'de cok fazla calisma yapmadim. Ama yaptigim eski bir projedeki procedure ve trigger'larin yazimina baktim. Benzer kodlar var bende de... Onlara bakara sizin kodlarda ufak tefek degisiklikler gordum. Bunların duzeltilmis hali su sekilde. Fakat duzeltilmis derken buradaki bildigim net bir hatadan dolayi duzeltme degil. Benim yazdigim koda gore farkli olanlari degistirdim. mesela suspend; kullanımı vs.. gibi.. Denemekte fayda olur diye dusunuyorum... For .. do... suspend komutlari result set donme durumlarında ise yariyor diye hatirliyorum. Sizin procedure sadece inser yapiyor bnedeki benzer orneklerde de bunlari hic kullanmamısım...

Kod: Tümünü seç

*************************************************************CREATE PROCEDURE DETAYLARINI_OLUSTUR ( 
IN_O_EOYILI CHAR(9), 
IN_O_OGRENCI_NO CHAR(10)) 
AS 
DECLARE VARIABLE SKS_SORU_NO SMALLINT; 
DECLARE VARIABLE CDS_SORU_NO SMALLINT; 
BEGIN 

/*SK DETAYLARINI OLUŞTURUYOR*/ 
SELECT SKS_SORU_NO FROM SKS INTO :SKS_SORU_NO ;

INSERT INTO SKD (SKD_OGRENCI_NO, SKD_EOYILI, SKD_SORU_NO, SKD_CEVAP) 
VALUES (:IN_O_OGRENCI_NO,:IN_O_EOYILI,:SKS_SORU_NO , ''); 


/*ÇD DETAYLARINI OLUŞTURUYOR*/ 
SELECT CDS_SORU_NO FROM CDS INTO :CDS_SORU_NO ;

INSERT INTO CDD ( CDD_OGRENCI_NO, CDD_EOYILI, CDD_SORU_NO, CDD_CEVAP) 
VALUES (:IN_O_OGRENCI_NO,:IN_O_EOYILI,:CDS_SORU_NO , ''); 
 
END 
ornek trigger cagirma kodum ise su sekilde

Kod: Tümünü seç

execute procedure SPI_MUSTERI_BORC NEW.MUSTERI_NO, NEW.PARA_BIRIMI_NO, NEW.TUTAR;
bundan yana bir sorun olacagini sanmiyorum ama procedure'u bu sekilde bi deneyim derim. Fazlaliklari atarken noktalivirgul vs.. hatasi yapmis olabilirim zira deneme sansim olmadi...

viewtopic.php?t=644 linkindeki makalede trigger ve storedprocedure yazimi da onerdigim sekilde.

Kolay gelsin....
goksenin
Üye
Mesajlar: 37
Kayıt: 04 Ara 2003 11:59
İletişim:

ÖNEMLİ AÇIKLAMA

Mesaj gönderen goksenin »

İlginize teşekkürler...
Belki cevap verecek diğer arkadaşlarda olur diye şunları yazıyorum SUPPEND olayı SQL cümlesinden 1 den fazla değer sutun döndüğü için tek tek kayıtları dolaşmamı sağlıyor en azından araştırmalarımdan bu sonuca vardım ve oylede olmalı zira sizin yazdığınız tarzda procedureyi yazar ve çalıştırırsam bu yönde yani SQL den dönen değerler 1 den fazla olduğu için hata veriyor...
yani ben ilk önce iki parametre gönderiyorum ve sabitlerin bulunduğu bir tabledan dönen değerlere göre başka bir tablea 1 den fazla insert yapmaya çalışıyorum...

benim olayında tek insert yok sabit tableda kaçtane kayıt varsa diğer tablea o kadar insert yapması lazım....

buna göre düşünürseniz sevinirim.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Benim godnerdiginzi koddan anladigim tek bir insert oldugu idi. Zira kodda butun kayitlari tarayan bir dongu veya bir toplu insert yok. Bu arada yeri gelmisken butun kayitlari sirasi ile taramak icin benim arastirdigim donemlerde interbase procedure icinden cursor tanimlama ve kullanmaya musade etmiyordu. O zaman kodu su sekle getirirsek saniyorum hem cok daha sade oldu hem de isi gorecegi kanaatindeyim....

Kod: Tümünü seç

*************************************************************CREATE PROCEDURE DETAYLARINI_OLUSTUR ( 
IN_O_EOYILI CHAR(9), 
IN_O_OGRENCI_NO CHAR(10)) 
AS 
BEGIN 
  /*SK DETAYLARINI OLUŞTURUYOR*/ 

  INSERT INTO SKD (SKD_OGRENCI_NO, SKD_EOYILI, SKD_SORU_NO, SKD_CEVAP) 
  select :IN_O_OGRENCI_NO,:IN_O_EOYILI, SKS_SORU_NO , ''
from SKS;

/*ÇD DETAYLARINI OLUŞTURUYOR*/ 
INSERT INTO CDD ( CDD_OGRENCI_NO, CDD_EOYILI, CDD_SORU_NO, CDD_CEVAP) 
select :IN_O_OGRENCI_NO,:IN_O_EOYILI, CDS_SORU_NO , ''
from CDS;
END 
Toplu insert yaptigimiz icin degiskenlere de gerek yok dongu veya cursor'e de .....
goksenin
Üye
Mesajlar: 37
Kayıt: 04 Ara 2003 11:59
İletişim:

TEŞEKKÜRLER (AMA) :)

Mesaj gönderen goksenin »

Teşekkür ederim....
Doğru bu yöntemle olur ve olduda (Aklıma gelmememişti...)
MSSQL de cursore alıştığım için direk atladım olaya...

Ancak SUSPEND i yapmaması çok ilginç ve cursor tanımlatmaması
şimdilik kurtardık durumu ya cursorlu bir şey yapmak zorunda kalırsam ne olacak bu olayın IB 6.5 ve/veya FB 1.5 + ta çözümü varmı ve eğer bu SUSPEND veya cursor kullanamıyorsam SUSPEND komutu neden var? yani kullanıldığı yer neresi bunun.

FOR lu --- SUSPEN li çalışan örnekler bulursanız ve yollayablirseniz sevinirim eninde sonunda yapmak gerekecek....

Hayırlı çalışmalar dilerim.
Göksenin.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

çozülmesine sevindim.
Ben hatirladigim kadari ile rapor amacli yazdigim procedurelerde suspend kullanıyorduk. Sonra da bu procedure'u delphi'den cagirip rapor yapiyorduk. Asagida projeden aldigim calisan bir procedure ornegi var...

Kod: Tümünü seç

CREATE PROCEDURE SP_CARI_HESAP_EKSTRESI (
  MUSTERI_NO INTEGER
) RETURNS (
  PARA_BIRIMI CHAR(10),
  ISLEM_TIPI CHAR(10),
  TARIH DATE,
  TUTAR DOUBLE PRECISION,
  ACIKLAMA CHAR(120)
) AS                                 
 
BEGIN
 FOR  
   select PB.AD, 'TAHAKKUK' as ISLEM_TIPI,MB.TARIH, MB.TUTAR, MB.ACIKLAMA
   from MUSTERI_BORC MB, PARA_BIRIMI PB
   where MB.MUSTERI_NO=:MUSTERI_NO and MB.PARA_BIRIMI_NO=PB.PARA_BIRIMI_NO
   union
   select PB.AD, 'TAHSILAT' as ISLEM_TIPI, MT.TARIH, (0-MT.TUTAR) as TUTAR, MT.ACIKLAMA
   from MUSTERI_TAHSILAT MT, PARA_BIRIMI PB
   where MT.MUSTERI_NO=:MUSTERI_NO and MT.PARA_BIRIMI_NO=PB.PARA_BIRIMI_NO
   order by 1,2

  INTO :PARA_BIRIMI, :ISLEM_TIPI, :TARIH, :TUTAR, :ACIKLAMA
  DO
  SUSPEND;
END
Cursor tanimlama ihtiyaci olursa ya delphi tarafindan yapmaniz gerekecek. Ya da belki bu sorun hallolmustur. Bendeki stored procedure icinden cursor tanımlanamadıgı bilgisi 1-2 yıllık geçmişe sahip. Durumlar değişmiş ve gelişmiş olabilir....
anemos
Üye
Mesajlar: 110
Kayıt: 02 Nis 2007 07:51
Konum: Sakarya / Hendek

Mesaj gönderen anemos »

fahrettin yazdı:Bendeki stored procedure icinden cursor tanımlanamadıgı bilgisi 1-2 yıllık geçmişe sahip. Durumlar değişmiş ve gelişmiş olabilir....
Selamlar.
Başlık epeyi eski ama Cursor' un Procedure içinden tanımlanamaması sorunu çözüldü mü?
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Olduğu veya olmadığını bilmiyorum fakat Firebird deki FOR SELECT ... bu amaçla kullanılabiliyor :idea:

Kod: Tümünü seç

FOR SELECT ALAN1, ALAN2 FROM TABLO
   WHERE ALAN1 > 150
   INTO :DCL_ALAN1, :DCL_ALAN2
  DO BEGIN
    -- yapılacak işlemler..
    -- cursor bloğu gibi..
    -- .....
  END
Bu yapı bence CURSOR yapısına göre daha basit ve kullanışlı :wink:

http://www.firebirdsql.org/manual/migra ... mlSayfanın altında Cursor kısmına bakılabilir.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla