Merhaba, bu yazımızda Merkez Bankası sitesinden döviz kurlarını çekeceğiz. Ancak bu işlemi biraz farklı olarak SQL Serverdan çekeceğiz.

SQL Server dan TCMB Döviz Kurlarını çekme

Merhaba, bu yazımızda Merkez Bankası sitesinden döviz kurlarını çekeceğiz. Ancak bu işlemi biraz farklı olarak SQL Serverdan çekeceğiz. Bunun amacı arada herhangi bir yazılım olmadan SQL Server özelliklerini kullanarak TCMB nin sitesine bağlanıp verileri XML olarak almak. Bu işlemi stored procedure olarak kaydedip SQL Server Jobs yardımıyla her gün bu verilerin otomatik olarak alınmasını sağlayabiliriz. 

TCMB günlük döviz kurlarını alacağımız sitenin linki (http://www.tcmb.gov.tr/kurlar/201604/15042016.xml). Bu linki inceleyecek olursak sabi URL kısmı (http://www.tcmb.gov.tr/kurlar). Geri kalan bölümü ise tarihe göre değişiklik göstermekte. Bunun için verilen tarihi Catalog (yyyyMM) ve tarih (ddMMyyyy) formatında url e eklememiz gerekiyor. Bu işlemi aşağıdaki şekilde gerçekleştirebiliriz.

    DECLARE		@win INT
    DECLARE		@hr INT
	DECLARE		@url VARCHAR(300)
	Declare		@UrlCatalog nvarchar(6)
	Declare		@UrlDate nvarchar(8)

	Set @UrlCatalog = FORMAT(@Date, 'yyyyMM')
	Set	@UrlDate = Format(@Date, 'ddMMyyyy')
	set @url = 'http://www.tcmb.gov.tr/kurlar/' + @UrlCatalog + '/' + @UrlDate + '.xml'

Bu işlem ile verileri alabileceğimiz Url i belirlemiş olduk. Daha önceki yazılarımızda SQL den Web sitelerine istek göndermeyle ilgili fonksiyonlar hazırlamıştık. Bu fonksiyonlardaki kodları kullanarak bu web sitesinden kur verilerini alacağız. Ancak daha önceki yazımızda istekte bulunduğumuz web sitelerinden gelen verileri ResponseText nvarchar(max) tanımlı değişkenlere atıyorduk. Bu da nvarchar(4000) den büyük verilerde sıkıntı oluşturacak. Bunun için bir temp tablo oluşturup gelen verileri bir değişkene atamak yerine direkt bu temp tablonun içerisine yazacağız. 

	Create table #ResponseTable(ResponseText nvarchar(max), ResponseXml xml)

	EXEC @hr = sp_OACreate 'WinHttp.WinHttpRequest.5.1', @win OUT
	IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

	EXEC @hr = sp_OAMethod @win, 'Open', NULL, 'GET', @url, 'false'
	IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

	EXEC @hr = sp_OAMethod @win, 'Send'
	IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

	Insert into #ResponseTable
	(
		ResponseText
	)
	EXEC @hr = sp_OAGetProperty @win, 'ResponseText'

	IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

	EXEC @hr = sp_OADestroy @win 
	IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 

Burada ResponseTable adında temp tablo oluşturduk. Bu tablonun iki ayrı kolonu bulunuyor. Bunlardan ResponseText gelen veriyi salt olarak yazacağımız kolon. Diğeri ise ResponseXml bu gelen veriyi düzenleyerek salt XML verisi şeklinde yazabileceğimiz kolon. ResponseText kolonundaki verileri ResponseXml kolonuna update i aşağıdaki şekilde yapabiliriz.

	Update	#ResponseTable
	Set		ResponseXml = Replace(Replace(ResponseText,'<?xml version="1.0" encoding="ISO-8859-9"?>',''),'<?xml-stylesheet type="text/xsl" href="isokur.xsl"?>','') 

 Bu işlemi de gerçekleştirdikten sonra XML kolonundaki bilgileri aşağıdaki select cümlesiyle alarak kendi tablolarımızı güncelleyebiliriz. 

		select	@Date Tarih,
				b.Data.value('@Kod', 'nvarchar(5)') DovizCinsi,
				b.Data.value('(Isim/text())[1]', 'nvarchar(50)')  COLLATE Turkish_CI_AS DovizAdi ,
				b.Data.value('(Unit/text())[1]', 'nvarchar(50)') Birim,
				b.Data.value('(ForexBuying/text())[1]', 'float') Alis,
				b.Data.value('(ForexSelling/text())[1]', 'float') Satis
		From #ResponseTable
			Cross apply #ResponseTable.[ResponseXml].nodes('/Tarih_Date//Currency') b(Data)

Bunun sonucunu aşağıdaki şekilde görüntüleyebiliriz.

Result
Tarih DovizCinsi DovizAdi Birim Alis Satis
2016-04-14 USD ABD DOLARI 1 2.8591 2.8642
2016-04-14 AUD AUSTRALYA DOLARI 1 2.1916 2.2059
2016-04-14 DKK DANIMARKA KRONU 1 0.43189 0.43401
2016-04-14 EUR EURO 1 3.2193 3.2251
2016-04-14 GBP INGILIZ STERLINI 1 4.0358 4.0568

Bu şekilde verilerin geldiğini görebiliriz. Bundan sonrasında yapabileceğimiz işlemler Döviz Cinsi tablomuzda eksik olan döviz cinslerini kontrol ederek ekleyebilir, Döviz Kurları tablomuzda günlük döviz kurlarını ekleyebiliriz. Bunu Jobs oluşturup hafta içi hergün verileri almasını sağlayabilirsiniz. 

Stored procedure in tamamını aşağıda bulabilirsiniz. 

create procedure sp_GetTCMBExchangeRate
	@Date date
as
begin
    DECLARE		@win INT
    DECLARE		@hr INT
	DECLARE		@url VARCHAR(300)
	Declare		@UrlCatalog nvarchar(6)
	Declare		@UrlDate nvarchar(8)

	Set @UrlCatalog = FORMAT(@Date, 'yyyyMM')
	Set	@UrlDate = Format(@Date, 'ddMMyyyy')
	set @url = 'http://www.tcmb.gov.tr/kurlar/' + @UrlCatalog + '/' + @UrlDate + '.xml'

	Create table #ResponseTable(ResponseText nvarchar(max), ResponseXml xml)

	EXEC @hr = sp_OACreate 'WinHttp.WinHttpRequest.5.1', @win OUT
	IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

	EXEC @hr = sp_OAMethod @win, 'Open', NULL, 'GET', @url, 'false'
	IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

	EXEC @hr = sp_OAMethod @win, 'Send'
	IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

	Insert into #ResponseTable
	(
		ResponseText
	)
	EXEC @hr = sp_OAGetProperty @win, 'ResponseText'

	IF @hr <> 0 EXEC sp_OAGetErrorInfo @win

	EXEC @hr = sp_OADestroy @win 
	IF @hr <> 0 EXEC sp_OAGetErrorInfo @win 


	Update	#ResponseTable
	Set		ResponseXml = Replace(Replace(ResponseText,'<?xml version="1.0" encoding="ISO-8859-9"?>',''),'<?xml-stylesheet type="text/xsl" href="isokur.xsl"?>','') 

		select	@Date Tarih,
				b.Data.value('@Kod', 'nvarchar(5)') DovizCinsi,
				b.Data.value('(Isim/text())[1]', 'nvarchar(50)')  COLLATE Turkish_CI_AS DovizAdi ,
				b.Data.value('(Unit/text())[1]', 'nvarchar(50)') Birim,
				b.Data.value('(ForexBuying/text())[1]', 'float') Alis,
				b.Data.value('(ForexSelling/text())[1]', 'float') Satis
		From #ResponseTable
			Cross apply #ResponseTable.[ResponseXml].nodes('/Tarih_Date//Currency') b(Data)

	drop table #ResponseTable

end

 

İlgili Makaleler

Bu yazıya 0 yorum yapılmış.

Yorum Gönder