PL/SQL, SQL cümlelerine blok yapılarının,şart cümlelerinin,dögülerin v.b diğer özelliklerin eklenmesiyle oluşmuş bir dildir.En temel yapı birimi bloktur.Bir veya birden fazla bloktan oluşabilirler.Akış kontrolü sayesinde yapısal dillere ait olan şart cümleleri ve döngüler PL/SQL bloklarında kullanılabilir. Aşağıdaki resimde bir PL/SQL bloğunun çalışması gösterilmiştir.

PL/SQL Block - PL/SQL Engine

Birbirleriyle ilişkili ifadelerin mantıksal bölümlere ayrılması demektir.Değişken tanımlamaları ve hata kontrolleride her blok içerisinde yapılabilir.PL/SQL blok yapısı 3 bölümden oluşur.


[DECLARE

-- delarations]

BEGIN

-- statements

[EXCEPTION

-- handlers

END;

Bu üç bölümden sadece ikincisi zorunludur. Yani Begin-End kısmı zorunlu alandır;

  • Declare tanımlama alanıdır.Burada memory içinde saklayabileceğiniz değişkenleri yada cursor gibi tanımlamaları yapabiliriz
  • Begin – End; Bu alanda asıl çalışacak sql kodlar, if/else gibi kontrol yapıları yada tüm işlemlerimiz yazılır.
  • Exception  alanında oracle tarafından tanımlanmış hata bildirimlerini yada kendinizin de tanımlayabileceği hatalar yada sizin kontrolünüzde olamyan durumlar karşısında neler yapmak isteyeceğinizi bildirebilirsiniz.

Block içinde variable, type, procedure ve function kullanabiliriz. İç içe blocklar kullanabileceğimiz gibi bunlar içinde procedure de çağırabiliriz.

SQL> DECLARE
  l_number  NUMBER;
BEGIN
  l_number := 1;

  BEGIN
    l_number := 2;
  END;
END;
/

İç içe blok kullanırken referans olan block un kapsamına dikkat etmeliyiz örneğin referans olan tabloda kullandığımız değişkeni içteki block da kullanamayız kullanmamız durumunda aşağıdaki gibi hata alırız.

BEGIN
  DECLARE
    l_number  NUMBER;
  BEGIN
    l_number := 1;
  END;

  l_number := 2;
END;
/

ERROR at line 8:
ORA-06550: line 8, column 3:
PLS-00201: identifier 'L_NUMBER' must be declared
ORA-06550: line 8, column 3:
PL/SQL: Statement ignored

NOT : PL/SQL’i sqlplus’ta çalıştırıyorsak blockdan gelen degerleri görmek için SERVEROUTPUT parametresini açmamız gerekir.

SQL> set SERVEROUTPUT ON
DECLARE
   message  varchar2(20):= 'Hello, World!';
BEGIN
   dbms_output.put_line(message);
END;
/
Hello, World!

PL/SQL procedure successfully completed.

Block içinde hatalı bir kısım var ise ve exception tanımı yapılmamışsa block çalışmadan hata verir fakat block içinde olası senaryolara göre exception tanımlarsak block umuz tanımladığımız exceptiona uygun olarak başarılı bitecektir.

Örnegin birinci block da exception olmadığı için block çalışırken hata vermektedir ama ikinci block da exception kullanıldığı için block problemsiz çalışmaktadır

DECLARE
  l_date  DATE;
BEGIN
  SELECT SYSDATE
  INTO   l_date
  FROM   dual
  WHERE  1=2; -- For zero rows
END;
/

DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 4
DECLARE
  l_date  DATE;
BEGIN
  SELECT SYSDATE
  INTO   l_date
  FROM   dual
  WHERE  1=2; -- For zero rows
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    NULL;
END;
/

PL/SQL procedure successfully completed.

PL/SQL Delimiters

Delimiter Açıklama Örnek
+, -, *, / Toplama,çıkarma,çarpma,bölme 5+3, 5*7
% Özellik belirteci credit REAL(7,2);debit  credit%TYPE;
Karakter dizesi sınırlayıcı
. Component seçici Hr.employees
(,)
: Degişken belirteci
, Öge ayrıcı employees,departments
Özel karakterler için “last name”
= İşlenenlerin birbiri ile eşit olup olmadığını kontrol eder,eşit ise işlem true ‘dir. (A = B) true değil
@ Uzaktan erişim için select 1 from dual@testdb;
; Statement sonlandırıcı
:= Atama operatörü
=> Association operatörü
|| Birbirine baglama operatörü ‘Mustafa’||’Tepe’ – ‘5 + 12 / 4 = ‘ || TO_CHAR(5 + 12 / 4)
** Üssel operatörüdür yani sayının kuvvetini alır
<<, >> Label delimiter
/*, */ Birden fazla satır için yorum
Tek satırlık yorum
.. Aralık vermek için operatör. Örnektede görüldügü gibi 0 ile 9 arasında ki değerleri için kullanabiliriz. A .. Z – a .. z – 0..9
<, >, <=, >= Büyüklük, küçüklük true ve false dönderir (A > B)  true değil
!=,<>, ‘=, ~=, ^= İşlenenlerin birbirlerine eşit olmadığını kontrol eder ve eşit değil ise ilişkisel operatör sonucu true ‘dir. (A != B)  true

Yararlı olması Dilegiyle …
Yazar : Mustafa Bektaş Tepe

Kaynaklar;
http://www.tutorialspoint.com/plsql/plsql_basic_syntax.htm
https://developersdaily.wordpress.com/category/plsql/?blogsub=confirming#subscribe-blog
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/toc.htm
https://oracle-base.com/articles/misc/introduction-to-plsql

Loading