INTERBASE TE PROCEDURE VE TRIGGER ÇALIŞTIRAMAMA
INTERBASE TE PROCEDURE VE TRIGGER ÇALIŞTIRAMAMA
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.
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.
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...
ornek trigger cagirma kodum ise su sekilde
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....
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
Kod: Tümünü seç
execute procedure SPI_MUSTERI_BORC NEW.MUSTERI_NO, NEW.PARA_BIRIMI_NO, NEW.TUTAR;
viewtopic.php?t=644 linkindeki makalede trigger ve storedprocedure yazimi da onerdigim sekilde.
Kolay gelsin....
ÖNEMLİ AÇIKLAMA
İ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.
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.
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....
Toplu insert yaptigimiz icin degiskenlere de gerek yok dongu veya cursor'e de .....
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
TEŞEKKÜRLER (AMA) :)
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.
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.
ç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...
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....
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
Olduğu veya olmadığını bilmiyorum fakat Firebird deki FOR SELECT ... bu amaçla kullanılabiliyor
Bu yapı bence CURSOR yapısına göre daha basit ve kullanışlı
http://www.firebirdsql.org/manual/migra ... mlSayfanın altında Cursor kısmına bakılabilir.
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
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!!