PL/SQL mi T-SQL mi? İki Prosedürel SQL Lehçesini Satır Satır Okumak
Karşılaştırma

PL/SQL mi T-SQL mi? İki Prosedürel SQL Lehçesini Satır Satır Okumak

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

PL/SQL ve T-SQL aynı ihtiyaca cevap verir: SQL'e değişken, koşul, döngü ve hata yönetimi eklemek. Fark, kodun nasıl gruplandığında, hataların nasıl yakalandığında ve küçük sözdizimi alışkanlıklarında ortaya çıkar.

Bir bakışta

  1. Hangi dili yazacağınızı veritabanı belirler, tercih değil. PL/SQL Oracle'da, T-SQL SQL Server ve Azure SQL ürünlerinde çalışır; biri diğerinin platformunda çalışmaz.
  2. PL/SQL blok yapısıyla, T-SQL toplu iş (batch) mantığıyla kurulur. PL/SQL'de değişkenler bloğun başındaki tanım bölümünde yazılır; T-SQL'de DECLARE ile akışın herhangi bir yerinde tanımlanabilir.
  3. Tek satır okuyan sorgu iki dilde farklı davranır. PL/SQL'de SELECT INTO satır bulamazsa hata fırlatır; T-SQL'de değişkene atama yapan SELECT sessizce değişkeni olduğu gibi bırakır.
  4. Oracle paketlerinin T-SQL'de doğrudan karşılığı yoktur. Çeviri projelerinde paketler şemalara ve ayrı yordamlara bölünür; bu, kodun yeniden düzenlenmesini gerektirir.

İki dil de SQL'in eksik bıraktığını tamamlar

SQL bildirimseldir: ne istediğinizi söylersiniz, nasıl yapılacağına motor karar verir. Ama gerçek iş kurallarında koşul, döngü, ara değişken ve hata durumunda ne yapılacağı da gerekir. Oracle bu ihtiyacı PL/SQL ile, Microsoft SQL Server ise Transact-SQL (T-SQL) ile karşılar. Oracle belgeleri PL/SQL'i SQL'in veri işleme gücünü prosedürel dillerin işlem gücüyle birleştiren bir dil olarak tanımlar.

İki dilde de saklı yordam, fonksiyon ve tetikleyici yazılır; işlemler (transaction) yönetilir; imleçlerle satır satır işlem yapılır. Bu yüzden birini iyi bilen geliştirici diğerinin mantığını kısa sürede kavrar. Zorlandığı yer kavramlar değil, aynı fikrin farklı yazılışı ve özellikle bazı durumlarda dillerin farklı davranmasıdır. Bu yüzden iki dili karşılaştırırken yalnız yazılışa değil, aynı kodun hata, boş değer ve çok satır durumlarında ne yaptığına bakmak gerekir; sözdizimi karşılıklarını ezberlemek, davranış farklarını bilmenin yerini tutmaz.

Kod yapısı: blok ile toplu iş arasındaki fark

PL/SQL kodu bloklar halinde yazılır. Oracle belgesine göre bir blok tanım bölümü (DECLARE), çalıştırma bölümü (BEGIN ... END) ve hata yakalama bölümünden (EXCEPTION) oluşur; yalnız çalıştırma bölümü zorunludur. Değişkenler tanım bölümünde yazılır ve %TYPE ile bir tablo sütununun tipine bağlanabilir:

DECLARE v_tutar siparis.tutar%TYPE; BEGIN SELECT tutar INTO v_tutar FROM siparis WHERE siparis_id = p_id; EXCEPTION WHEN NO_DATA_FOUND THEN v_tutar := NULL; END;

T-SQL'de değişken adları @ ile başlar ve DECLARE akışın istenen yerinde kullanılabilir. Aynı okuma şöyle yazılır:

DECLARE @tutar money; SELECT @tutar = tutar FROM siparis WHERE siparis_id = @id; IF @tutar IS NULL PRINT 'Sipariş bulunamadı';

İki parçanın davranışı aynı değildir. PL/SQL'de SELECT INTO satır bulamazsa NO_DATA_FOUND, birden fazla satır bulursa TOO_MANY_ROWS hatası doğar. T-SQL'deki atama hata vermez; satır yoksa değişken eski değerinde kalır, birden fazla satır varsa son okunan değer atanır. Çeviri yapan geliştiricinin en sık atladığı fark budur.

Günlük yazımda karşılık tablosu

Farkların büyük kısmı ezberlenebilir karşılıklardır:

  • Değişken tanımı: PL/SQL: blok başında, ad öneki yok. / T-SQL: DECLARE @ad tip, akış içinde.
  • Değer atama: PL/SQL: := ya da SELECT INTO. / T-SQL: SET ya da SELECT @ad =.
  • Metin birleştirme: PL/SQL: || işleci. / T-SQL: + işleci ya da CONCAT.
  • Anlık tarih: PL/SQL: SYSDATE. / T-SQL: GETDATE().
  • Hata yakalama: PL/SQL: EXCEPTION bölümü ve WHEN. / T-SQL: TRY ... CATCH blokları.
  • Kod gruplama: PL/SQL: paket tanımı ve gövdesi. / T-SQL: şema altında ayrı yordam ve fonksiyonlar.

Bu tablo, otomatik çeviri araçlarının çıktısını gözden geçirirken kontrol listesi olarak da kullanılabilir.

Şekil 1

Aynı fikir, farklı yazılış

PL/SQLT-SQL
Değişken tanımıBlok başında, ad öneki yokDECLARE @ad tip, akış içinde
Değer atama:= ya da SELECT INTOSET ya da SELECT @ad =
Metin birleştirme|| işleci+ işleci ya da CONCAT
Hata yakalamaEXCEPTION bölümü ve WHENTRY ... CATCH blokları
Kod gruplamaPaket tanımı ve gövdesiŞema altında ayrı yordamlar
Kaynak: sayfa içeriği; blok yapısı Oracle, TRY...CATCH Microsoft belgelerindenMindset Institute

Hata yönetimi iki dilde nasıl kurulur?

PL/SQL'de hata, bloğun EXCEPTION bölümünde adıyla yakalanır: NO_DATA_FOUND gibi hazır adlar ya da geliştiricinin tanımladığı istisnalar WHEN ile ele alınır, gerekirse RAISE ile yukarıya iletilir. Hata yakalama bloğa bağlıdır; iç içe bloklarla hatanın nerede ele alınacağı ayarlanır.

T-SQL'de Microsoft'un tanımıyla TRY ... CATCH, C# ve C++'taki istisna yönetimine benzer. TRY bloğunda hata oluşursa denetim CATCH bloğuna geçer; CATCH içinde ERROR_NUMBER ve ERROR_MESSAGE gibi fonksiyonlarla hatanın ayrıntısı okunur. Microsoft belgesi iki önemli sınırı da belirtir: TRY bloğunun hemen ardından CATCH gelmelidir ve bu yapı kullanıcı tanımlı fonksiyon içinde kullanılamaz. Ayrıca CATCH içinde yakalanan hata çağıran uygulamaya kendiliğinden dönmez; uygulamanın hatayı görmesi gerekiyorsa CATCH içinde yeniden fırlatılmalıdır.

Çeviri sırasında en riskli nokta budur: PL/SQL'de yukarıya iletilen bir hata, T-SQL'e çevrilirken CATCH içinde yutulursa uygulama işlemin başarılı olduğunu sanar.

Bir yordamı diğer dile taşırken izlenecek yol

Oracle'dan SQL Server'a ya da tersine geçen projelerde prosedürel kod, işin en çok emek isteyen kısmıdır. Kurgusal bir örnekte bir şirket, sipariş onayında stok düşen ve fatura kaydı açan bir PL/SQL paketini T-SQL'e taşıyor.

Ekip önce paketin içindeki her yordamı ve hangi uygulamanın hangisini çağırdığını listeler. Sonra paketi şema altında ayrı yordamlara böler, ortak değişkenleri parametreye ya da tabloya taşır. Yeniden yazımda SELECT INTO kullanımlarını tek tek bulup satır yok ve çok satır durumlarını açıkça kontrol eder. Son olarak aynı test verisiyle iki sistemde yordamı çalıştırıp çıkan stok ve fatura kayıtlarını karşılaştırır.

Şekil 2

Çeviri, satır satır değil davranış davranış yapılır

  1. EnvanterPaketteki yordamları ve onları çağıran uygulamaları listele.
  2. Yeniden bölmePaketi şema altında ayrı yordamlara ayır, ortak değişkenleri taşı.
  3. Davranış kontrolüSELECT INTO ve hata yakalama noktalarını tek tek ele al.
  4. Karşılaştırmalı testAynı veriyle iki sistemde çalıştır, sonuç kayıtlarını eşleştir.
Kaynak: sayfa içeriği; kurgusal örnekMindset Institute

Geçişte sık yapılan hatalar

  • Otomatik çeviri çıktısını test etmeden kabul etmek. Araçlar sözdizimini çevirir ama satır bulunamadığında ya da boş metin geldiğinde farklı davranışı yakalayamayabilir.
  • Oracle'da boş metnin NULL sayıldığını unutmak. T-SQL'de boş metin ile NULL ayrı değerlerdir; koşullar farklı satırları döndürebilir.
  • Paket düzeyindeki değişkenleri gözden kaçırmak. Oracle'da oturum boyunca değer taşıyan paket değişkenlerinin T-SQL'de doğrudan karşılığı yoktur.
  • İşlem sınırlarını aynı sanmak. Hangi komutun işlemi kendiliğinden kapattığı ve hata durumunda işlemin ne olduğu iki platformda ayrıca kontrol edilmelidir.

Bu hataların ortak noktası, kodun derlenmesi ama yanlış sonuç üretmesidir. Bu yüzden çeviri başarısı derleme hatasının olmamasıyla değil, aynı girdiye aynı çıktının alınmasıyla ölçülür.

Mindset programlarında prosedürel SQL

SQL ile Programlama Eğitimi, iki lehçenin ortak zemini olan veritabanı ve tablo oluşturma, veri işleme dili, sorgular, hesaplamalar, join, gruplama ve görünümler üzerinde çalışır. Prosedürel kodu doğru yazmanın ön koşulu, tek satırlık SQL'in nasıl davrandığını iyi bilmektir.

Saklı yordam ve tetikleyici yazmaya geçmek isteyen geliştirici ve analistler için SQL ile Veri Sorgulama (İleri) programı, görünümler, stored procedure ve tetikleyiciler ile yürütme planı analizini ele alır.

İlgili Mindset programı

SQL ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

T-SQL yalnız SQL Server'da mı çalışır?

T-SQL Microsoft'un veritabanı ürünlerinin dilidir. Microsoft'un TRY ... CATCH belgesinde bu yapının SQL Server'ın yanı sıra Azure SQL Database, Azure SQL Managed Instance ve Microsoft'un bazı analitik servislerinde de geçerli olduğu belirtilir. Oracle, PostgreSQL ya da MySQL üzerinde T-SQL kodu çalışmaz; bu sistemlerin her birinin kendi prosedürel dili vardır.

Oracle'da TRY ... CATCH yazılabilir mi?

Hayır, PL/SQL'de bu sözdizimi yoktur. Aynı işi bloğun EXCEPTION bölümü görür: hata adıyla WHEN altında yakalanır, gerekirse işlem geri alınır ve hata RAISE ile çağırana iletilir. Bir kod parçası için ayrı hata davranışı istiyorsanız o parçayı iç içe bir BEGIN ... END bloğuna alıp kendi EXCEPTION bölümünü yazarsınız.

Standart SQL bilen biri PL/SQL ya da T-SQL'e nereden başlamalı?

Önce çalıştığınız platformun dilini seçin, ikisini aynı anda öğrenmeye çalışmayın. Değişken tanımlama ve atama, IF ile koşul, döngü ve basit bir saklı yordam yazarak başlayın. Ardından hata yakalamayı ve işlem yönetimini öğrenin; gerçek iş kodlarında en çok sorun bu ikisinden çıkar. İmleçleri en sona bırakın, çünkü çoğu iş küme tabanlı tek bir sorguyla daha verimli yapılır.

Saklı yordam yazmak için mutlaka prosedürel dil gerekir mi?

Basit bir saklı yordam yalnız tek bir SQL sorgusunu parametreyle çalıştırabilir; bunun için prosedürel dilin ileri özellikleri gerekmez. Ancak koşula göre farklı işlem yapmak, birden çok tabloyu tek işlem içinde güncellemek ya da hatayı yakalayıp kayıt altına almak gerektiğinde değişken, koşul ve hata yönetimi devreye girer; bunlar PL/SQL ve T-SQL'in sağladığı yeteneklerdir.

Aynı kodu iki platformda da çalışır yazmak mümkün mü?

Yalnız düz SQL sorgularında kısmen mümkündür: standart SELECT, JOIN, GROUP BY ve CASE ifadeleri iki tarafta da çalışır. Satır sınırlama, tarih fonksiyonları ve metin birleştirme gibi noktalarda lehçe farkı başlar. Prosedürel kodda ise ortak yazım pratik değildir; değişken, atama ve hata yakalama sözdizimi farklıdır. Birden çok veritabanını destekleyen uygulamalar bu yüzden iş kuralını genellikle uygulama katmanında tutar.