Etiket Arşivi pl/sql türkçe

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 759 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 4878 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 4: Stored Procedure(Saklı Yordam)

Merhabalar.

Bu yazıda “Stored Procedure” lerden yani -hiç sevemediğim tabirle- saklı yordamlardan bahsetmeye çalışacağım. Ben kısaca SP veya prosedür demeyi tercih ediyorum.

* SPler şemaların altında oluşturulan veritabanı nesneleridir.

* İlk oluşturulduğunda derlenir ve sonraki defalar direkt çalıştırılır.

* Pek çok işlemin yapılabileceği(SQL sorguları çalıştırılabilir, döngü ve şart yapıları kullanılabilir vs.), veritabanında saklanan, C# veya Java’daki metodların benzeri(tam karşılığı değil belirli özellikleriyle benzer) yapılardır.

* Blok yapısı aşağıdaki gibidir:

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

Örneklere geçmeden önce kullanacağım tabloya göz atmakta fayda var. Tablonun ismi ogrenci. Aşağıdaki kolonlar ve değerler var tabloda:

sp1

İlk etapta aşağıdaki gibi parametresiz bir SP oluşturarak, basitçe en yüksek not ortalamasını ekrana yazdıralım.

CREATE OR REPLACE PROCEDURE max_ortalama_yazdir
IS
	v_max_ortalama   NUMBER := 0;
BEGIN
	SELECT	MAX (not_ortalama) INTO v_max_ortalama FROM ogrenci;

	DBMS_OUTPUT.put_line ('En yüksek ortalama: ' || v_max_ortalama);
END max_ortalama_yazdir;

Buradaki SELECT INTO yapısı, seçilen değerin, verilen değişkene atanmasını sağlıyor. Yani maksimum not değerini v_max_ortalama isimli yerel değişkenimize atıyor. Daha sonra o bu değeri ekrana yazdırıyoruz. Prosedürü aşağıdaki gibi çalıştırabiliriz:

BEGIN
max_ortalama_yazdir;
END;

..ve çıktı:
sp2

Şimdi gelelim parametre yapısına. SPlere 3 tip parametre gönderebiliyoruz:
IN: Bu tiple prosedüre parametre gönderilip içeride kullanılır.
OUT: Bu tip ile gönderilen parametreye, prosedürün 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ı.

Aşağıdaki gibi bir örnekle parametre yapısını inceleyebiliriz. Örnekte prosedüre gönderilen no ile öğrencinin adı,soyadı ve not ortalamasının 100’lük sistemdeki karşılığı geri dönülüyor. Burada p_yuzluk_sistem_not değişkenini 25 olarak gönderip, 4’lük sistemdeki ortalamayı bununla çarparak, çıkan sonucu tekrar p_yuzluk_sistem_not değişkenine atıyorum. Prosedüre p_no parametresini IN, p_ad ve p_soyad parametrelerini OUT, p_yuzluk_sistem_not parametresini ise IN OUT olarak gönderiyorum.

CREATE OR REPLACE 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;

Aşağıdaki bloktan da prosedürümü çağırarak neler olduğuna bakıyorum:

DECLARE
	v_no			NUMBER := 1;
	v_ad			VARCHAR2 (10);
	v_soyad			VARCHAR2 (20);
	v_yuzluk_sistem_not	NUMBER := 25;
BEGIN
	ogrenci_bilgi (v_no, v_ad, v_soyad, v_yuzluk_sistem_not);
	DBMS_OUTPUT.put_line ('No: ' || v_no);
	DBMS_OUTPUT.put_line ('İsim: ' || v_ad || ' ' || v_soyad);
	DBMS_OUTPUT.put_line ('Yüzlük sistemdeki not: ' || v_yuzluk_sistem_not);
END;

Görüldüğü gibi v_ad ve v_soyad değişkenlerinin değerleri tamamen prosedür içerisinde oluşturuldu. Yine v_yuzluk_sistem_not değişkeninin de değeri 25 olarak set edildiği halde, prosedürün içinde değişikliğe uğradı.

Kendinize çook iyi davranın.

 

Bu sayfa 1726 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 1: Giriş

Merhabalar.
Dilim döndüğünce PL/SQL’in ne olduğundan bahsetmeye çalışacağım. Devamındaki yazılarda da konu konu ilerlemeye çalışacağım.
PL/SQL:
* ORACLE veritabanında SQL sorgularını çalıştırmaya ve yorumlamaya yarayan bir programlama dilidir.
* Temel SQL tanımlarına yapısal dil özellikleri eklenerek oluşturulmuştur.
* Blok yapısında bir dildir.
* Değişkenler oluşturulabilir, prosedürler ve fonksiyonlar yazılabilir.
* IF-THEN-ELSE, CASE-WHEN gibi koşul yapıları, WHILE Loop, FOR Loop gibi döngüler kullanılabilir.
* Exception(hata/istisna) yönetimi vardır.

 

Bu sayfa 1592 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