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.
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