CURSOR
(GÖSTERİCİ)
İlişkisel database’ lerde işlemler satırlar üzerinde yapılır. Bu satırlar, SELECT deyimi içinde WHERE sözcüğü ile seçilir. Böylece ortaya sonuç seti (result set) çıkar. Bununla birlikte uygulamalar sonuç seti (veri) üzerinde etkin biçimde çalışabilmesi için gerekli bir mekanizmaya sahip olması gerekir. Bu araca cursor (gösterici) denir. Cursor’ lar satır işlemlerini yönlendiren mekanizmadır.
- Sonuç seti üzerinde belli bir satıra gitmek.
- Sonuç satırı üzerinde bulunan konumdan bir yada daha çok satırı almak.
- Mevcut konum üzerindeki satırlarda data değiştirmek.
- Diğer kullanıcılar tarafından yapılan değiştirme işlemlerini değişik düzeylerde desteklemek.
- Trigger, stored procedure ve script içindeki Transact-SQL deyimlerinin sonuç seti üzerinde data değişikliği yapmasını sağlamak.
Transact-SQL Cursor’lar
Transact-SQL cursor’lar genellikle stored procedures, triggers ve Transact-SQL scritlerinde kullanılırlar ve sonuç seti olarak üretilen listenin diğer Transact-SQL cursor’ların kullanımı süreci şu şekilde oluşur.
- Cursor tarafından dönecek Transact-SQL değişkenleri tanımlanır.
- DECLARE CURSOR deyimi ile bir SELECT deyimi ile Transact-SQL cursor arasında ilişki kurulur. DECLARE CURSOR deyimi cursor’ın özelliklerini tanımlar.
- SELECT deyimini işletmek için OPEN deyimi kullanılır.
- FETCH INTO deyim ile istenilen satırların elde edilmesi sağlanır.
- Cursor’ın sona ermesinin ardından CLOSE deyimi kullanılır.
OPEN deyimi sonuç seti oluşturur.
FETCH ise sonuç setinden bir satırı döndürür.
CLOSE deyimi ise mevcut sonuç setini serbest bırakır.
Veri tabanında yer alan tablolar üzerinde INSERT (EKLEME), UPDATE (DÜZELTME) ve DELETE (SİLME) işlemleri ile ne tip hareketlerin yapılması gerektiği SQL Server’ a Trigger’ lar ile bildirilir.
Örneğin, herhangi bir fişi yada satırı sildiğimizi varsayalım. Bu durumda, fiş toplam tutarı, cari hesap toplam tutarı yada bakiyesi, stok toplam tutarı, miktarı vb. Bir takım zincirleme değişiklik yapılması gerekmektedir.
Bu trigger’ lar(tetikleyici) ile Stored Procedure’ların (Küçük SQL cümlecikleri) çalışmasını sağlayarak diğer table’ların update edilmesini sağlar.
Böylece tüm veri senkronize halde çalışır.
SQL Query ile bir hareket tablosu üzerinde yapacağım UPDATE, INSERT ve DELETE işlemlerinde TRIGGER’ lar devreye girmediği için ilişkisel diğer tablolar etkilenmeyecektir.
ÖRNEK : Sipariş fişi satırları “bekliyor” statüsünü “kapandı” olarak değiştirilmesi.
UPDATE LG_024_01_ORFLINE SET CLOSED=1
Bu şekilde query yazıp çalıştırıldığında sipariş satırlarını kapandı olarak değiştirecektir fakat malzeme ve cari toplamlarında değerler kalacaktır. Yukarıdaki şekilde yapılan Toplu UPDATE işleminde Triggerler devreye girmeyecektir. Bu işlemin yerine aşağıdaki gibi Cursor ile çalıştırılmalıdır.
DECLARE @ORFLINEREF INT
DECLARE SIPARIS_SATIR_UPDATE CURSOR FOR
SELECT * FROM LG_024_01_ORFLINE WHERE CLOSED=0
OPEN SIPARIS_SATIR_UPDATE
FETCH NEXT FROM SIPARIS_SATIR_UPDATE
into @ORFLINEREF
WHILE @@FETCH_STATUS = 0
BEGIN
SET ROWCOUNT 0
UPDATE LG_024_01_ORFLINE SET CLOSED=1 WHERE LOGICALREF=@ORFLINEREF
FETCH NEXT FROM SIPARIS_SATIR_UPDATE
into @ORFLINEREF
END
CLOSE SIPARIS_SATIR_UPDATE
DEALLOCATE SIPARIS_SATIR_UPDATE
———————————————————————————————–CARİ HAREKET FATURA NO UPDATE —————————————————————————————————-
DECLARE @LOGICALREF INT
DECLARE @FICHENO VARCHAR(17)
DECLARE FAT_IRS_NO_UPD CURSOR FOR
SELECT
H.LOGICALREF, F.FICHENO
FROM
LG_003_01_INVOICE F,
LG_003_01_CLFLINE H
WHERE
F.LOGICALREF=H.SOURCEFREF
AND H.MODULENR=4
AND H.TRANNO<>F.FICHENO
OPEN FAT_IRS_NO_UPD
FETCH NEXT FROM FAT_IRS_NO_UPD
INTO @LOGICALREF, @FICHENO
WHILE @@FETCH_STATUS = 0
BEGIN
SET ROWCOUNT 0
UPDATE LG_003_01_CLFLINE SET TRANNO=@FICHENO WHERE LOGICALREF = @LOGICALREF AND MODULENR=4
FETCH NEXT FROM FAT_IRS_NO_UPD
INTO @LOGICALREF, @FICHENO
END
CLOSE FAT_IRS_NO_UPD
DEALLOCATE FAT_IRS_NO_UPD
Comments