SQL STORED PROCEDURE ve CURSOR KULLANIMI
Perşembe, Ağustos 03, 2017 /
Tamer YIGIT
/
MsSQL
Aşağıdaki örnekte TeklifOlustur adında bir prosedür oluşturduk.
Prosedürün yapacağı iş, birkaç tablodan UNION ALL ile birleştirilerek alınmış sorgu sonucunu stored procedure içinde tanımlanmış @TABLO adında bir tabloya yazmak.
Daha sonra kursor adıyla tanımlanmış CURSOR vasıtasıyla bu tablo üzerinde satır satır dolaşarak SELECT, SUM gibi çeşitli işlemler yaptıktan sonra bulduğu bilgileri TEKLIF tablosuna eklemek.
USE [BOSFOR_WEB_YONETIM_FIDE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [dbo].[TeklifOlustur]
AS
DECLARE @ILKTARIH NVARCHAR(100) = GETDATE() --güncel zaman--procedure içinde kürsörde kullanmak üzere bir tablo tanımlıyoruz
DECLARE @SONTARIH NVARCHAR(100) = DATEADD(yy,10,GETDATE()) --güncel zamana 10 yıl ekledik
DECLARE @TABLO TABLE
(
FIRMA NVARCHAR(50),
SIPARISNO NVARCHAR(50),
EKIMNO NVARCHAR(50),
FIDEADI NVARCHAR(250),
VARYANT NVARCHAR(50),
SEEDITEMREF NVARCHAR(50),
TOHUMADI NVARCHAR(250),
PLANLANANEKIMTARIHI NVARCHAR(50),
TESLIMTARIHI NVARCHAR(50),
SIPARISMIKTARI NVARCHAR(50),
PLNMIKTAR INT,
EKILENMIKTAR NVARCHAR(50),
BEKLEYENMIKTAR NVARCHAR(50),
TEKLIFMIKTARI NVARCHAR(50),
KALANGUN NVARCHAR(250)
)
INSERT @TABLO
SELECT TMP2.*
FROM (
SELECT
TMP.*
,KALANGUN=(SELECT DATEDIFF(day, GETDATE(), PLANLANANEKIMTARIHI))
FROM (
SELECT * FROM FITAP.[dbo].[FF_220_TOHUMBILGI](@SONTARIH,@ILKTARIH)
UNION ALL
SELECT * FROM FITAP.[dbo].[FF_230_TOHUMBILGI](@SONTARIH,@ILKTARIH)
UNION ALL
SELECT * FROM FITAP.[dbo].[FF_240_TOHUMBILGI](@SONTARIH,@ILKTARIH)
UNION ALL
SELECT * FROM FITAP.[dbo].[FF_250_TOHUMBILGI](@SONTARIH,@ILKTARIH)
UNION ALL
SELECT * FROM FITAP.[dbo].[FF_260_TOHUMBILGI](@SONTARIH,@ILKTARIH)
UNION ALL
SELECT * FROM FITAP.[dbo].[FF_270_TOHUMBILGI](@SONTARIH,@ILKTARIH)
) AS TMP
) AS TMP2
WHERE TOHUMADI IS NOT NULL
AND KALANGUN<=5
ORDER BY PLANLANANEKIMTARIHI
SELECT * FROM @TABLO
--CURSOR BAŞLIYOR
DECLARE @TOHUMAD NVARCHAR(250)
DECLARE @PLANLANANMIKTAR INT
DECLARE kursor CURSOR FOR
--TABLOYU GRUPLANDIRARAK ALDIK
SELECT TOHUMADI FROM @TABLO GROUP BY TOHUMADI
OPEN kursor
FETCH NEXT FROM kursor
INTO @TOHUMAD
WHILE @@FETCH_STATUS = 0
BEGIN
--Burada TOHUMADI'na göre filtreleme yap ve PLNMIKTAR alanlarındaki veriyi toplayıp @PLANLANANMIKTAR değişkenine at
--TOHUM ADINA GÖRE BAK
SELECT @PLANLANANMIKTAR=SUM(PLNMIKTAR) FROM @TABLO WHERE TOHUMADI=@TOHUMAD
--KAYIT EKLE
INSERT INTO TEKLIF (TohumAd,KayitTarihi,Miktar) VALUES (@TOHUMAD,(SELECT GETDATE()),@PLANLANANMIKTAR)
FETCH NEXT FROM kursor INTO @TOHUMAD
END
CLOSE kursor
DEALLOCATE kursor
Bu prosedür otomatik olarak belirli aralıklarla çalışsın istenirse Sql Server'da Job oluşturulabilir.
http://blog.tameryigit.com/2017/08/sql-serverda-job-zamanlanmis-gorev.html