9 Kasım 2014 Pazar

SQL'de Temporary (Geçici) ve Değişken (Variable) Tabloların Kullanımı

SQL'de oluşturulan geçici tablolar, kullanıcıya ait olan veritabanında tutulmazlar. SQL Server’da tempdb içinde tutulurlar. Bu tempdb sisteme ait bir veritabanıdır. tempdb geçici tabloları tuttuğu gibi aynı zamanda SQL Server üzerinde çalıştırılan sorgular sonucu arka planda tablosal işlemlerin yapıldığı ve verilerin bizim ekranımızda geçici olarak oluşturulduğu yapınında gerçekleşmesini sağlarlar. SQL'de Temporary tablo oluştururken iki seçeneğimiz bulunmakta. Bunlar kullanım şeklinize göre farklılık gösterebilir.
  • Geçici Tablolar (Temporary Tables)
  • Değişken Tablolar (Table Variables)
Geçici Tablolar (Temporary Tables)
Geçici tabloları oluşturmak için de tıpkı normal bir tabloyu oluşturmakta kullandığımız "CREATE TABLE" ifadesini kullanırız. Fakat oluşturulan tablonun gerçek bir tablo mu yoksa geçici bir tablo mu olduğunun ayırt edilmesi için; oluşturduğumuz tablonun sanal bir tablo olduğunu SQL'e "#" işaretini kullanarak bildiririz. CREATE TABLE ifadesinden sonra yazılan tablo isminin başına "#" işaretini eklediğimizde SQL bu tablonun geçici bir tablo olduğunu algılar ve oluşturulan tabloyu yalnızca ilgili oturum için geçerli kılar. Oturum kapatıldıktan sonra veya bir başka Query ekranı açıldığında bu tabloya erişilemez. SQL Serverda geçici tablolara sadece bulundukları ortamlardan erişilebilir. Temp Tabloların normal tablolardan en önemli farkı bir System Database olan tempdb içinde tutuluyor olmalarıdır.

Eğer temp table'a global olarak diğer ortamlardan da erişilmesini istiyorsak o zaman global temp table kullanmamız gerekmektedir. Global Temporary Tables (Genel geçici tablolar) tanımlamak için temp table dan farklı olarak CREATE TABLE dediktenden sonra tablomuzun ismini vermeden önce "##" işaretini 2 adet kullanarak bildirim yaparız. Global Temporary Tables'ın bütün özellikleri temp table ile aynıdır.

Genel Yapısı:
CREATE TABLE #TabloAdı (kolon1 veritipi, kolon2 veritipi) 
--Local Temporary Table için "#" Global Temporary Table için "##" kullanılmalıdır.

Geçici tablolar tıpkı normal tablolar gibi oluşturulurlar sadece önlerinde "#" işareti farkı vardır. 

Örnek:
CREATE TABLE ##Musteriler(MusteriID NCHAR(5), MusteriAdSoyad NVARCHAR(30),
MusteriSehir NVARCHAR(15));
INSERT INTO ##Musteriler(MusteriID,MusteriAdSoyad,MusteriSehir)
SELECT Customers.CustomerID, ContactName, City
FROM Customers 


Örneğimizde ##Musteriler adında bir Global Temporary Table oluşturduk. Query bağlantısında Northwind Database Customers tablosu örneklendi. Resimde görüldüğü gibi aktif database "BAYRAKTAR" olmasına rağmen global bir temporary table oluşturduğumuz için "select *  from ##Musteriler" ile listeleme yaptığımızda verilerin listelendiğini görüyoruz.

SQL Serverda "#" ile başlayan tablolar SQL Server durduğu ana kadar saklanır. Fakat tablolarımızı tempdb altına kendimiz normal tablo ekler gibi eklersek tablolarımız SQL Server kapatılana kadar orda saklanır. SQL Server kapatıldığında temp tablolarımızın silinmesini istiyorsak:
DROP TABLE #TemporaryTable  

Temporary Tablolar Nerede ve Ne Amaçla Kullanılır?
Büyük veritabanları ile çalışırken bir sorgu sonucunda dönen kayıtları başka bir sorguda join işlemine tabi tutmak isteyebiliriz. Temporary Table kullanmak yerine iç içe SELECT sorguları yazılabilir ancak bu büyük kayıtlarda SQL Server üzerinde performans sıkıntısına neden olur. Bu nedenle belirli bir sorgu sonucunu Temporary bir tabloya atmak ve bu tabloyuda başka bir sorguda kullanabiliriz.

Değişken Tablolar (Table Variables)
Değişken tablolarda aslında geçici tablolara benzemektedir. Farkı oluşturduğumuz tablonun bir kısmı tempdb de bir kısmıda Sunucu olarak kullanıdığımız SQL Server belleğinde tutulmaktadır. Oluşturduğumuz tablo isminin başına "@" işareti koyarız. Değişken tablolara erişim temporary tablolara göre daha hızlıdır. Fakat değişken tablolara fazla veri yüklemek belleği dolduracağından performans kaybına yol açabilir. Değişken tabloların Temporary tablolardan en önemli farkı kullanıcı tanımlı fonksiyonlar (User Defined Functions) içinde kullanılabilmeleridir.

Genel Yapısı:
DECLARE @TabloAdı TABLE (kolon1 veritipi, kolon2 veritipi)
  • Değişken Tablolar tıpkı Temporary Tablolar gibi oluşturulurlar önlerinde "@" işareti farkı vardır. 
  • Değişken Tablolar üzerinde index tanımı yapamayız fakat geçici tablolar üzerinde yapabiliriz. 
  • Değişken tablolar üzerinde ALTER TABLE komutunu kullanamayız, yani bu şekilde oluşturulan bir tabloda ALTER TABLE işlemi yapılamıyor. Bu tipteki bir yapı çok fazla veri içermeyecek tablolar için uygundur.
Örnek:
DECLARE @Musteriler TABLE 
(MusteriID NCHAR(5), MusteriAdSoyad NVARCHAR(30), MusteriSehir NVARCHAR(15))
INSERT INTO @Musteriler(MusteriID,MusteriAdSoyad,MusteriSehir)
SELECT Customers.CustomerID, ContactName, City 
FROM Customers 

7 Kasım 2014 Cuma

SQL'de Transaction Oluşturma ve Kullanımı

Transaction  Nedir?
Transaction için SQL Server ortamında kullandığımız iş birimidir diyebiliriz. Çoğu zaman bir transaction yalnızca bir türde işlem yapar, yani sadece veri silme, veri güncelleme veya veri ekleme gibi tek türde işlem yapar. Ama bir transaction içinde birden fazla da işlem yapılabilir. Yine transaction içinde SELECT işlemleri de yapılabilmektedir. Transaction, çalışma yapısı olarak ya bütün işlemleri gerçekleştirir ya da hiçbirini gerçekleştirmez. İşlemlerden biri başarısız olursa, hiçbir işlem gerçekleşmez; ancak tüm işlemler başarılı olduğunda  Transaction, içinde gerçekleşen tüm veri değişikliklerini onaylamış demektir.  

Transaction bloğundaki işlemlerin hepsi başarılı olduğunda Transaction Commit (Onaylama) komutu çalışır ve değişiklikler veritabanında gerçekleşmiş olur. ancak bir hata varsa işleyiş bozulur ve Transaction Rollback (Geridönüş) komutu çalışır, bu şekilde tüm işlemler geri alınır ve en başa dönülür. Böylece veri kaybına karşı bir çeşit koruma mekanizması oluşturulmuş olunur.

Transaction  Nerde ve Ne Zaman Kullanırız
Örneğin veri tabanımızdan silinen kayıtları, başka bir veri tabanına yedekliyorsak. Bir silinme ve bir kaydetme işlemi söz konusu. Bu işlemlerin sırayla gerçekleşmesi gerekiyor. Silinme işlemi başarılı bir şekilde tamamlandı. Fakat kaydetme işleminde bir hata meydana geldi. Bu hata yetersiz hafızadan kaynaklanabilir, sistem işlem sırasında yeniden başlatılmıştır veya fiziksel bir arıza nedeniyle kapanmıştır. Bu nedenler yüzünden silinmiş kaydımıza elveda demek yerine, böylesi sorunlarla karşılaşma ihtimalimize karşı önlemimizi almamız gerekir. Çalışmasını istediğimiz kod bloğunu "transaction" bloklarına alırız ve sorun çözülmüş olur.

Şimdi örnekle konuyu pekiştirelim.

Örnek: Bir banka sisteminde para havale etme işlemi için örnek bir transaction tasarlayalım. Öncelikle aşağıdaki gibi bir "HESAP" tablosu oluşturalım ve tablomuzda müşterilere ait HESAP_ID, AD, SOYAD, HESAP_NO, BAKIYE bilgilerini tutalım. 
CREATE DATABASE BANKA
USE BANKA

CREATE TABLE HESAP
(
HESAP_ID INT PRIMARY KEY IDENTITY (1,1) NOT NULL,
AD       VARCHAR(30) NOT NULL,
SOYAD    VARCHAR(30) NOT NULL,
HESAP_NO INT         NOT NULL,
BAKIYE   INT         NOT NULL
)

Oluşturmuş olduğumuz "HESAP" tablomuza örnek kayıtlar girelim.
INSERT INTO HESAP VALUES('İBRAHİM','BAYRAKTAR',19265,7000)
INSERT INTO HESAP VALUES('SAMET','ULUTURK',19572,10000)
INSERT INTO HESAP VALUES('RAMAZAN','PINARBAŞI',19752,9500)
INSERT INTO HESAP VALUES('RAŞİT','BAKIR',19912,17000)

"Samet ULUTURK'ün hesabından, İbrahim BAYRAKTAR'ın hesabına 1000 TL havale yapılsın." Bu işlem için izleyeceğimiz algoritma Samet ULUTURK'ün bakiye bilgisini 1000 azaltmak ve İbrahim BAYRAKTAR'ın bakiye bilgisini 1000 artırmak olacaktır.
UPDATE HESAP SET BAKIYE = BAKIYE - 1000 --1.Sorgu
WHERE AD='SAMET' AND SOYAD='ULUTURK'

UPDATE HESAP SET BAKIYE = BAKIYE + 1000 --2.Sorgu
WHERE AD='İBRAHİM' AND SOYAD='BAYRAKTAR'
Havale işleminin gerçekleşmesi için bu iki sorgunun aynı anda gerçekleşmesi gerekir ve sistem kullanıcısı bu iki sorguyu birden çalıştırıyor. Şimdide örnek işlemimizde oluşabilecek olası hata senaryolarını inceleyelim.

Hata Olasılığı 1: Birinci SQL sorgumuzun çalışması fakat ikinci SQL sorgumuzda hata oluşması. Bu durumda Samet ULUTURK'ün hesabından 1000 TL eksilme olacak fakat İbrahim BAYRAKTAR'ın hesabında herhangi bir değişiklik olmayacaktır.

Hata Olasılığı 2: Birinci SQL sorgumuzda hata oluştu ve ikinci SQL sorgumuzun çalışması durumunda Samet ULUTURK'ün hesabından herhangi bir eksilme olmayacak fakat İbrahim BAYRAKTAR'ın hesabına 1000 TL eklenecek.

Örneğimizdeki gibi problemlerin ve olası hatalardan oluşacak karmaşanın önüne geçmek için  "transaction" yapısını kullanmalıyız. "transaction" sayesinde her iki sorguda birden çalıştıralacak, iki sorguda başarılı ise "transaction" onaylanacak fakat herhangi bir hata durumunda he iki sorguda iptal edilecek.

"transaction" yapısını SQL kodlarında kullanırken COMMIT ve ROLLBACK komutları kullanılır.

COMMIT komutu ile çalıştırılan tüm SQL komutlarının başarılı olması halinde işlemler veri tabanına yansıtılır. ROLLBACK komutu ise herhangi bir hata oluşumunda tüm işlemleri geri alır. 

Transaction  Oluşturalım
BEGIN TRANSACTION
BEGIN TRY

UPDATE HESAP SET BAKIYE = BAKIYE - 1000
WHERE AD='SAMET' AND SOYAD='ULUTURK'

UPDATE HESAP SET BAKIYE = BAKIYE + 1000
WHERE AD='İBRAHİM' AND SOYAD='BAYRAKTAR'

COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH

"BEGIN TRANSACTION" ile "transaction" işlemini başlatıyoruz. Tek bir komut gibi çalışmasını istediğimiz SQL kodlarımızı yazdıktan sonra  "transaction" işlemini "COMMIT" ile sonlandırıyoruz. "COMMIT"  komutuna gelene kadar işlemde hata olsa da olmasa da, işlem sonuçları tablomuza yansımayacaktır. "END TRY" ile blogumuzu kapatıyoruz. İşlemde bir hata ile karşılaşılması durumunda "BEGIN CATCH" blogu devreye girecek ve "ROLLBACK" komutu ile yapılan işlemler geri alınacak.

Java Dizi Örnek

Klavyeden girilen N elemanlı bir dizinin;
  • Dizi elemanları toplamı
  • Dizi elemanları ortalaması
  • Dizi elemanları arasındaki maksimum değerin bulunması
  • Dizi elemanları arasındaki minimum değerin bulunması
  • Dizi elemanlarının küçükten büyüğe sıralanması
  • Bubble Sort (Kabarcık Sıralama) Algoritması
package DIZILER;
import java.util.Scanner;
public class DIZIORNEK {

public static void main(String[] args) {
  
int n, toplam, max, min;
min=max=toplam=0;
Scanner oku = new Scanner(System.in);
System.out.println("ELEMAN SAYISINI GIRINIZ:");

n=oku.nextInt();
int dizi[]=new int[n];
for(int i=0;i<dizi.length;i++) //Dizi elemanları toplamı
 {
    System.out.println((i+1)+"....SAYISINI GIRINIZ:");
    dizi[i]=oku.nextInt();
    toplam+=dizi[i];
 }
    int ort=toplam/n; //Dizi elemanları ortalaması
    for (int s=0;s<dizi.length;s++) //Dizi elemanları arasındaki maksimum değerin bulunması
 {
    if(dizi[s]>max)
   {
      max=dizi[s];
          }
 }
    min=dizi[0]; //Dizi elemanları arasındaki minimum değerin bulunması
    for(int a=0;a<dizi.length;a++) 
 {
         if(min>dizi[a])
    {
  min=dizi[a]; //Dizi elemanlarını küçükten büyüğe sıralanması
    }
 }
    int tut=0;//Bubble Sort - Kabarcık Sıralama Algoritması 
    for(int k=0;k<dizi.length-1;k++)
 {
  for(int y=0;y<dizi.length-1;y++)
         {
  if (dizi[y]>dizi[y+1])
     {
  tut=dizi[y];
  dizi[y]=dizi[y+1];
  dizi[y+1]=tut;
     }
  }
 }
 
System.out.println("DIZI ELEMANLARININ TOPLAMI="+toplam);
System.out.println("DIZI ELEMANLARININ ORTALAMASI="+ort);
System.out.println("DIZI ELEMANLARININ MAXIMUM DEGER="+max);
System.out.println("DIZI ELEMANLARININ MINIMUM DEGER="+min);

for(int b=0;b<dizi.length;b++)
{
 System.out.println((b+1)+"ELEMANIN DEGERI"+dizi[b]);
}

}}

5 Kasım 2014 Çarşamba

Bat Dosyası ile Bir Klasörü Otomatik Sıkıştırmak

Aşağıda verdiğim komutları bat dosyası haline getirin ve ilgili alanları düzenleyin.

C:\PROGRA~1\WinRAR\WinRAR.exe a -r -M1 -MD4096 -ibck -Y -O+ -ac -ep1 -ag+YYYYMMDD-HHMI "C:\AlinanYedek.rar" "C:\alinacak_klasor "
close

AlInacak Klasör: Hangi klasörü yedekliyorsanız onu yazın. Mavi ile işaretlediğim alan yedeğin nerede tutulacağı ve ilgili parametreleri düzenleyebilirsiniz. Tüm parametreler aşağıda. Daha sonra bu bat dosyasını Görev zamanlayıcıdan "Temel Görev Oluştur" kullanarak otomatik çalıştırabilirsiniz.

Commands:
a add files to an archive
c add an archive comment
d delete files from an archive
e extract files from an archive, ignoring paths
f freshen files within an archive
i find string in archives
k lock an archive
m move files and folders to an archive
r repair a damaged archive
rc reconstruct missing volumes
rn rename archived files
rr[N] add data recovery record
rv[N] create recovery volumes
s[name] convert an archive to a self-extracting type
s- remove SFX module
t test archive files
u update files within an archive
x extract files from an archive with full paths

3 Kasım 2014 Pazartesi

WampServer Üzerinde Phpmyadmin "root" Parolasını Değiştirmek

WampServer'ın kurulu olduğu dizinden \wamp\apps\phpmyadmin\config.inc.php yolunu izleyerek config.inc.php dosyamızı editörümüzle açıyoruz;


parolamızı değiştirdikten sonra dosyamızı kaydedip kapatıyoruz. Ardından WampServer üzerinden Restart All Services tüm servisleri yeniden başlatıyoruz.

Copyright 2013-2017 | İbrahim BAYRAKTAR /dev/null Web Günlüğü