5 Kasım 2011 Cumartesi

PL/SQL'e Giriş

PL/SQL açılımı Procedural Language/Structured Query Languge'dir.Yani Prosedür Dili/ Yapılandırılmış Sorgulama Dili.PL/SQL yapısal dillere ait özelliklerin SQL’e eklenmesiyle ortaya çıkan Oracle’a has bir dildir.PL/SQL Oracle firmasının piyasaya sürdüğü her üründe önemli bir yere sahiptir. Kullanıcılar PL/SQL’i kullanarak programlarına bir çok yeni özellikler katmaktadırlar. Bunlar arasında;
  • PL/SQL tabanlı kaydedilmiş yordamlar(stored procedures) ve veritabanı tetiklemeleri(triggers) ile önemli iş kurallarını programlamak
  • Oracle Developer ürünleri ile güçlü ve kolay kullanılabilir görsel ortamlarla programları detaylandırmak ve daha rahat kontrol etmek
  • Oracle tabanlı uygulamalarda nesne-tabanlı(object-oriented) tasarımlar yapma Web sayfalarından Oracle veritabanlarına link yapma
  • PL/SQL’in belki de en önemli özelliği istemci-sunucu ortamları tasarlama ile ağ üzerinde dağıtık işlemler yapma ve bir çok sorguyu çalıştırma imkanı sunmasıdır.
PL/SQL nesneleri :
  • Constant(Sabitler),
  • Variable(Değişkenler),
  • Exception(İstisnalar),
  • Procedure(Prosedürler),
  • Function(Fonksiyonlar),
  • Package(Paketler),
  • Record(Kayıtlar),
  • PL/SQL Table,
  • Cursor(İmleçler),
  • Reserved Word(Reserve Edilmiş Kelimelerdir BEGIN, END gibi)
*PL/SQL çalıştırmak içn Sql*Plus, Toad, PL/SQL Developer gibi programlara giriş yaparak kullanabiliriz.Ben uygulamaları Toad kullanarak yapacağım.

BEGIN
DBMS_OUTPUT.PUT_LINE('Merhaba PL/SQL!');
END;
/
Ekran Çıktısı:
Merhaba PL/SQL!
PL/SQL procedure successfully completed.

Eğer sizin bilgisayarınız bu çıktı görünmüyorsa SQL kodun başına
SET SERVEROUTPUT ON; kodunu ekleyin.Bu sunucunun dışaraya yazı çıkartmasını sağlar.

1.Blok Yapısı
PL/SQL programı blok yapılarına bölünür.Her blok PL/SQL ve SQL deyimlerini içerir.Tipik bir PL/SQL bloğu aşağıdaki yapıya sahiptir.

[DECLARE
declaration_statements
]
BEGIN
executable_statements
[EXCEPTION
exception_handling_statements
]
END;

I)Tanımlama ve istisna blokları isteğe bağlıdır.
II)declaration_statements sonradan geri kalanı blok kullanılan değişkenler bildirir.
III)Bu değişkenler, o blok için yerel.
IV)Bildirimleri her zaman blok başında yerleştirilir.
V)executable_statements blok için gerçek çalıştırılabilir ifadeler.
VI)
executable_statements döngüler, koşullu mantığı, vb gibi görevleri gerçekleştirmek için ifadeler içerebilir.
VII)
exception_handling_statements herhangi bir hata yakalama ifadelerdir.
VIII
Her deyim, bir noktalı virgül ile sonlandırılır (;).
IX)
Bir blok END anahtar kelime kullanarak sonlandırılır.

Örnekbir blok yapısı şu şekildedir:
DECLARE
genislik INTEGER;
yukseklik INTEGER :=2;
alan INTEGER;
BEGIN
alan := 6;
genislik := alan / yukseklik;
DBMS_OUTPUT.PUT_LINE('Genişlik = ' || genislik );
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Sıfıra Bölme Hatası');
END;
/
Output:
Genislik = 3
PL/SQL procedure successfully completed.

  • BAŞLICA PL/SQL VERİ TİPLERİ:
NUMBER: 38 basamağa kadar destek sunan nümerik veri tipidir.
BINARY_INTEGER: Nümerik bir yapıya sahiptir.Number veri tipinden farkı veritabanında daha az yer kaplamasıdır.
CHAR: Karakter veri tipidir.
VARCHAR2: Karakter veri tipidir.Değişken uzunlukta karakterleri tutabilir. Maksimum uzunluğu 32767 bytedır.
LONG: Varchar2 veri tipi gibidir. Fakat karakter tutma sınırı 2GB’a kadar yükselir.
LONG RAW: Long tipinde binary olarak veri tutan veri tipidir.
BOOLEAN: True-False tipi değerleri depolar.
DATE: Tarih ve saat unsurlarını tutabilen veri tipidir.
TIMESTAMP: Date gibi tarih saat değerlerini tutar. Ayrıntılı olarak yüzyıldan saniyeye kadar olan bütün bilgileri tutar.

Veri Tipleri ile İlgili Başlıca Özellikler:
  • PL/SQL de değer atama := sembolleriyle yapılır
  • Değişken tanımlanması şu şekilde yapılmaktadır;
<değişken ismi> veri tipi [NOT NULL ] [:= <ilk değer>]

DECLARE
sistem_tarihi DATE := sysdate;
BEGIN
DBMS_OUTPUT.PUT_LINE(sistem_tarihi);
END;
/
Output:
05/11/2011
PL/SQL procedure successfully completed.

  • Sabitlerin tanımlanması ise adı üzerinde sabit bir değer verilir ve sonradan değiştirilemez.Değişkenlerden farkı bununla birlikte ilk değer atamasının hemen yapılmasıdır
   <sabit_ismi> veri tipi CONSTANT [NOT NULL] [:=<ilk değer>]
 Pi_sayisi CONSTANT NUMBER := 3.14; gibi

  • Pl/Sql’de veritabanı ile iletişimde olan tipler tanımlamaktan bahsedersek %TYPE ve %ROWTYPE niteleyicilerini kullanabilirsiniz.Örneğin aşağıdaki cümlede çalışanlar tablosundaki çalışan adı bilgisini tutan kolon tipinde bir veri tipi tanımlayabiliriz.Örneğin;
calisan_ismi employees.FIRST_NAME%TYPE

declare
v_ename employee.first_Name%TYPE;
v_emp_rec employee%ROWTYPE;
begin
v_ename := 'MURAT';
v_emp_rec.first_Name := 'ALİ';
end;
/
  • Eğer bir değişkene değer atanmazsa oracle bu değişkenin değerini null olarak görür.
SET ECHO ON
SET SERVEROUTPUT ON
DECLARE
test INTEGER;
BEGIN
   IF test IS NULL THEN
DBMS_OUTPUT.PUT_LINE(' TEST değişkeni null''dur ');
   END IF;
test := 1;
DBMS_OUTPUT.PUT_LINE('TEST = ' || TO_CHAR(test));
   IF test IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('TEST değişkeni null değildir.');
   END IF;
END;
/
OUTPUT:
TEST degiskeni null'dur
TEST = 1
TEST degiskeni null degildir.
PL/SQL procedure successfully completed.

Kaynakça:
  • Learning Oracle PL/SQL ,Bill Pribyl&Steven Feuerstein
  • Oracle PL/SQL Programming Steven Feuerstein with Bill Pribly

  • http://www.ceturk.com/oracle-veritabanina-kusbakisi/
  • http://www.ceturk.com/plsql-blok-yapilariveri-tipleri/
  • http://www.java2s.com/Tutorial/Oracle/0420__PL-SQL-Data-Types/BlockStructure.htm

  • http://datawarehouse.gen.tr/Makale.aspx?ID=443&seo=plsql-yazi-dizisi2