Kategori Arşivi PL/SQL

PL/SQL’e Nereden Başlamalı?

Merhaba.

Bugün “PL SQL öğrenmek istiyorum ama nereden nasıl başlayacağımı bilmiyorum. Bir tavsiye verirseniz mutlu olurum” şeklinde bir mail aldım.

Ben de kalkıp bir Üstad edasıyla tavsiyelerimi sıralamaya başladım 🙂

Şaka bir yana bir üstad olmasam da tecrübesi benden daha az olanlara faydası olur ümidiyle naçizane tavsiyelerimi -az bir tasarrufla- buradan da paylaşmaya karar verdim.

Katkıda bulunmak isteyenler yorumlarını paylaşırsa memnun olurum.

Buyrun:

Öncelikle İngilizceniz iyiyse her şey çok kolay 🙂 İyi değilse doğal olarak biraz daha fazla efor sarfetmek gerekiyor. Ben blogda kapsamlı bir içerik üretmeyi hedefledim ama önce iş yoğunluğu akabinde ise iş değişikliğiyle beraber Oracle’dan Microsoft SQL Server veritabanına geçiş olunca maalesef yarım kaldı.

Hatta o dönem Türkçe kitap olmadığı için kitap yazmayı bile düşündüm ama fırsat bulamadım. Sonrasında Fahrettin Ateş, Orhan Eripek ve Özgür Umut Vurgun tarafından bir Türkçe kitap yayınlandı ama henüz inceleme imkanım olmadı.

Sorunuza gelirsek..

PL SQL dili, SQL üzerine bina edildiği için öncelikle temel SQL bilgisine sahip olmanız gerekmekte. Yani;

  • DML (SELECT, INSERT, UPDATE, DELETE)
  • DDL (CREATE, ALTER, DROP vb.)
  • Trigger, Primary Key, Foreign Key, GRANT, Snonym, Constrains, Distinct, Join, Group By, Order By yapıları ve terimlerini bilmeniz gerekiyor.

Bu konularla alakalı internette çokça Türkçe kaynak da bulabilirsiniz. Ama biraz İngilizceniz varsa tavsiyem buradaki veya buradaki tutorialları incelemeniz.

Sonrasında artık “merhaba dünya” diyebilirsiniz! Daha sonra

  • değişkenler,
  • fonksiyonlar,
  • prosedürler (stored procedures) şeklinde devam edebilirsiniz.

Bu kısımları ben de blogda anlatmaya çalıştım.

Sonraki aşamada yuklarıda bahsettiğim SQL işlemlerinin PL SQL’de nasıl kullanıldığını inceleyebilirsiniz.

Bunlardan sonra ise sırasıyla;

  • şart-koşul yapıları (IF-THEN-ELSE ve CASE yapıları),
  • cursorlar, döngüler(FOR, WHILE),
  • hata yönetimi (Exception Handling),
  • Transaction yönetimi şeklinde devam ederek ilerleyebilirsiniz.

Bu konuları da hallettikten sonra artık SQL Tuningle beraber daha derinlere dalabilirsiniz. Yazılımcıysanız muhtemelen bu kısımlar size yetecektir. Ama DBA iseniz daha da ilerlemenizde (benim de şu an bilmediğim sulara doğru :)) fayda var.

Benim bu saydığım konular için tavsiye edeceğim kaynak ise burada.

Naçizane tavsiyelerim bunlar. Umarım yardımcı olabilmişimdir.

Bu sayfa 630 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr

PL/SQL Türkçe Karakter Problemi

Merhabalar.

PL/SQL’de Türkçe karakterleri göremiyorsanız veya kodlarınız check-in yaptığınızda Türkçe karakterler “?” karakterine dönüşüyorsa aşağıdaki işlem muhtemelen derdinize deva olacaktır.

  • Computer sağ tık -> Properties -> Advanced system settings -> Environment Variables adımlarını takip ederek aşağıdaki pencereye ulaşın.

nls

  • Daha sonra açılan pencerede, Variable name: NLS_LANG ve Variable value: TURKISH_TURKEY.TR8MSWIN1254 değerlerini girip OK deyin.

nls2

 

Kendinize çook iyi davranın..

 

 Bu sayfa 1978 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr

PL/SQL 7: Paketler(Packages)

Merhabalar.

Bu yazıda paket(package) mevzusunu anlatmaya çalışacağım.

Paket, içerisinde birden fazla fonksiyon ve SP barındırabilen bir şema nesnesidir. Oracle’ın ifadesiyle:

  • Modülerliği sağlar.
  • Kullanım kolaylığını sağlar.
  • Uygulama dizaynını kolaylaştırır.
  • Performansı artırır. 

Paket 2 kısımdan oluşur.

  • Spec(specification) : Paketteki fonksiyon ve SPlerin bildirimlerinin yapıldığı arayüz kısmıdır.
  • Gövde(body) : Fonksiyon ve prosedürlerinin tanımlamalarının yapıldığı kısımdır.

Şablon:

Spec kısmı:

CREATE [OR REPLACE] PACKAGE paket_adı IS|AS

public tipler ve değişkenler
altprogram spesifikasyonları
END [package_name];

Body kısmı:

CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS
private tipler ve değişkenler
altprogram gövdesi
[BEGIN initialization statements]
END [package_name];

Örnek: Matematik Paketi

Şimdi örnek olarak “matematik” isminde bir paket oluşturuyorum.

İçerisine de 2 fonksiyon 1 tane de prosedür/SP koyuyorum.

Paketin “spec” tanımını yaparken yukarıda belirttiğim üzere fonksiyon ve prosedürlerin sadece bildirimlerini yazıyorum. Yani aldığı parametreleri ve -varsa- dönüş değerini.

Evet, şekil A:


CREATE OR REPLACE PACKAGE matematik
IS

FUNCTION toplama
 (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER)
RETURN NUMBER;

FUNCTION carpma
 (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER)
RETURN NUMBER;

PROCEDURE topla_ve_ekrana_yazdir
 (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER);

END;

Scripti koşturunca aşağıdaki şekilde paket objem oluşuyor:

package1

Şimdi de paketin gövdesini(body) oluşturuyorum:


CREATE OR REPLACE PACKAGE BODY matematik
IS
 PROCEDURE sonucu_ekrana_yazdir (p_sonuc IN NUMBER);

 FUNCTION toplama (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER)
 RETURN NUMBER
 IS
 v_sonuc NUMBER;
 BEGIN
 v_sonuc := p_sayi1 + p_sayi2;

 RETURN v_sonuc;
 END;

FUNCTION carpma (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER)
 RETURN NUMBER
 IS
 v_sonuc NUMBER;
 BEGIN
 v_sonuc := p_sayi1 * p_sayi2;
 RETURN v_sonuc;
 END;

PROCEDURE topla_ve_ekrana_yazdir (p_sayi1 IN NUMBER, p_sayi2 IN NUMBER)
 IS
 v_sonuc NUMBER;
 BEGIN
 v_sonuc := toplama (p_sayi1, p_sayi2);
 sonucu_ekrana_yazdir(v_sonuc);
 END;

 PROCEDURE sonucu_ekrana_yazdir (p_sonuc IN NUMBER)
 IS
 BEGIN
 DBMS_OUTPUT.put_line ('Sonuc : ' || p_sonuc);
 END;
END;

Buradaki sonucu_ekrana_yazdir prosedürü dikkatinizi çekmiş olmalı. Çünkü Paketin spec kısmında tanımlamadık. Sadece “body”de en üstte tanımladık ve burada kullandık.

Tahmin edeceğiniz üzere bu prosedürü “spec”te tanımlamadığımız için private bir prosedür oldu. Dolayısıyla yalnızca bu paketin içinde kullanabileceğiz.

Oluşturduğumuz paketin “body”si de altta.

package2

Paketin herhangi bir elemanını ise aşağıdaki gibi kullabiliriz:


BEGIN
matematik.topla_ve_ekrana_yazdir(3,5);
END;

Sonuç:

package3

Temel manada paket konusu bu şekilde.

Kendinize çook iyi davranın.

 Bu sayfa 3972 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr

PL/SQL 6: Saklı Yordamlar vs Fonksiyonlar

Merhabalar.

Bu yazıda Saklı Yordamlar(SPler) ile fonksiyonları karşılaştırmaya çalışacağım.

Karşılaştırmaya geçmeden önce örnek olması açısından, oluşturduğum aşağıdaki basit SP ve fonksiyonlara göz atmanızda fayda var.

SP IN olarak öğrencinin numarasını(p_no) ve IN OUT olarak yüzlük sisteme çevirme katsayısını (p_yuzluk_sistem_not) alıyor.

PROCEDURE ogrenci_bilgi(p_no IN NUMBER, p_ad OUT VARCHAR2, p_soyad OUT VARCHAR2, p_yuzluk_sistem_not IN OUT NUMBER)
IS
BEGIN
    SELECT  ad, soyad, not_ortalama * p_yuzluk_sistem_not
      INTO  p_ad, p_soyad, p_yuzluk_sistem_not
      FROM  ogrenci
     WHERE  no = p_no;
END; 

İlk fonksiyon ise öğrencinin numarasını IN olarak alıyor, ad ve soyadı OUT parametre olarak dönüyor ama return değeri olarak notun yüzlük sistemdeki karşılığını dönüyor. 2. fonksiyon ise ogrenci tablosundaki max not ortalamasını dönüyor.:

FUNCTION ogrenci_bilgi_function(p_no IN NUMBER, p_ad OUT VARCHAR2, p_soyad OUT VARCHAR2)
RETURN NUMBER
IS
    p_yuzluk_sistem_not NUMBER:=25;

BEGIN
    SELECT  ad, soyad, not_ortalama * p_yuzluk_sistem_not
      INTO  p_ad, p_soyad, p_yuzluk_sistem_not
      FROM  ogrenci
     WHERE  no = p_no;

RETURN p_yuzluk_sistem_not;
END; 
FUNCTION max_ortalama_getir
RETURN NUMBER
IS
v_max_ortalama NUMBER:=0;

BEGIN
    SELECT  MAX (not_ortalama) INTO v_max_ortalama FROM ogrenci;

    RETURN v_max_ortalama;
END max_ortalama_getir;

Benzerlikler:

  • Her ikisi de IN, OUT ve IN OUT tipinde parametreleri alırlar.
  • Blok yapıları benzerdir. Yerel değişken tanımlamaları aynıdır.
  • SELECT .. INTO deyimiyle tablolardan veriler çekilip, değişkenlere atanabilir.
  • DDL işlemleri içeremezler. (Dinamik SQL kullanımı hariç)

Farklılıklar:

  • Fonksiyonlar RETURN değer dönebilir, SPlerde bu söz konusu değildir.
  • Fonksiyonların (ideal) kullanımı return bir değer elde ederek bu değerin işlenmesi/kullanılmasıdır. SPlerin ise içerisinde belli işlemler(Ör DML işlemleri) yapılmasıdır. Bu yönüyle fonksiyonlar, nesne tabanlı dillerdeki değer dönen metodlara; SPler, void metodlara benzetilebilir.
  • Fonksiyonlarda DML işlemlerinden sadece SELECT deyimi kullanılabilir. SPlerde ise tamamı (SELECT,INSERT,UPDATE,DELETE) kullanılabilir.
  • Fonksiyonlar bir değer ifade ettikleri için sorgu cümlelerinde kullanılabilir, direkt bir değişkene eşitlenebilir veya işlemlerde değişken gibi kullanılabilir. SPler kendileri bu tarz işlemlerde kullanılamaz. Ancak OUT veya IN OUT ile doldurulan değişkenler kullanılabilir.
DECLARE
    v_max_ortalama     NUMBER := 0;
    v_sorgu_ortalama   NUMBER := 0;
BEGIN
    --Fonksiyonları direkt değişkenlere eşitleyebiliyoruz.
    v_max_ortalama := max_ortalama_getir();

    --Sorgu cümlelerinde fonksiyonları "değer" ifade ettiği için kullanabiliyoruz.
    SELECT not_ortalama
      INTO v_sorgu_ortalama
      FROM ogrenci
     WHERE not_ortalama = max_ortalama_getir ();

    dbms_output.put_line ('Fonksiyondan gelen ortalama : ' || max_ortalama_getir ());
    dbms_output.put_line ('Değişkenden gelen ortalama : ' || v_max_ortalama);
    dbms_output.put_line ('Sorgudan gelen ortalama : ' || v_sorgu_ortalama);
END;

Ekran görüntüsü:
sp vs func

Kendinize çook iyi davranın.

Bu sayfa 1400 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr

PL/SQL 5: Fonksiyonlar

Merhabalar.

Bu yazıda fonksiyonlardan bahsetmeye çalışacağım.
Fonksiyonlar bir önceki yazıda bahsettiğim prosedürler ile yapısal açıdan çok benzemektedir.
Yapısal açıdan tek farkı geriye değer dönmesidir diyebiliriz.
Hatta şunu da söyleyebiliriz: İşlev açısından prosedürler java/c#’taki void metodlara, fonksiyonlar ise değer dönen (string, int, bool vs.) metodlara benzer.

Fonksiyonların blok yapısı aşağıdaki gibidir:

CREATE [OR REPLACE] FUNCTION fonksiyon_adi
  [(parametre1 [mode] veritipi1,
  parametre2 [mode] veritipi2, ...)]
RETURN donen_degerin_veri_tipi
IS|AS
  [yerel_degisken_tanimlari; …]
BEGIN
  -- islemler;
  RETURN donen_deger
END [prosedur_adi];

 

Örnekler için kullanacağım ogrenci tablosu aşağıda:

sp1

Prosedürlerde yaptığım örneği burada da uygulayabilirim.
Tablodaki en yüksek not ortalamasını getiren bir fonksiyon oluşturuyorum:

CREATE OR REPLACE FUNCTION max_ortalama_getir
RETURN NUMBER
IS
v_max_ortalama NUMBER:=0;

BEGIN
	SELECT	MAX (not_ortalama) INTO v_max_ortalama FROM ogrenci;

	RETURN v_max_ortalama;
END max_ortalama_getir;

..ve bu fonksiyonu aşağıdaki gibi kullanıyorum:

BEGIN
dbms_output.put_line('En yüksek ortalama: '||max_ortalama_getir);
END;

Çıktı:

fonksiyon1

Parametre yapısı tamamen prosedürlerle aynı. O yüzden orada yazdığımı tekrar ediyorum:
Fonksiyonlara 3 tip parametre gönderebiliyoruz:
IN: Bu tiple fonksiyona parametre gönderilip içeride kullanılır.
OUT: Bu tip ile gönderilen parametreye, fomksiyonun içinde değer atanıp OUT edilir.
IN OUT: Bu tip ile de içeriye değer gönderilip, gerekirse değiştirilerek tekrar OUT edilir.

OUT ile IN OUT arasındaki fark tahmin edeceğiniz gibi, OUT gönderilen parametreye dışarıda değer atanmış bile olsa, prosedürün içinde bu değerin kullanılamaması.

NOT: Fonksiyonun kullanım amacı gereği, OUT ve IN OUT tipinde parametre kullanılmaması önerilir. Fonksiyonların kullanımında esas olan, direkt işlemlerin içinde(yukarıdaki örnekteki gibi) kullanılacak şekilde, tek bir değer dönmesidir.

Biz yine de OUT parametreli bir örnek yapalım:

CREATE OR REPLACE FUNCTION ogrenci_bilgi_function(p_no IN NUMBER, p_ad OUT VARCHAR2, p_soyad OUT VARCHAR2)
RETURN NUMBER
IS
p_yuzluk_sistem_not NUMBER:=25;
BEGIN
    SELECT  ad, soyad, not_ortalama * p_yuzluk_sistem_not
      INTO  p_ad, p_soyad, p_yuzluk_sistem_not
      FROM  ogrenci
     WHERE  no = p_no;

RETURN p_yuzluk_sistem_not;
END; 

Fonksiyonuma IN olarak gönderilen numaranın not ortalamasını basitçe 4’lük sistemden 100’lük sisteme çevirip RETURN ediyorum.

NOT: Buradaki SELECT INTO yapısı sayesinde SELECT kısmında gelen değerleri, INTO kısmındaki değişkenlere atayabiliyorum.

Aşağıdaki kodla, gelen ortalamayı konsola yazdırabilirim:

DECLARE
v_ad VARCHAR2(20);
v_soyad VARCHAR2(20);
BEGIN
dbms_output.put_line(ogrenci_bilgi_function(1,v_ad,v_soyad));
dbms_output.put_line(v_ad||' '||v_soyad);
END;

Sonuç aşağıdaki gibi oluyor:

func
Burada gördüğümüz gibi v_ad ve v_soyad değişkenlerini de doldurabiliyorum(hatta IN OUT değer de gönderip, doldurabilirdim), ama bahsettiğim gibi fonksiyonların kullanım mantığı gereği OUT değer barındıracak yapıları prosedür olarak oluşturmak daha iyi olacaktır.

Kendinize çook iyi davranın.

 Bu sayfa 6059 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr