VERİ TABANI YÖNETİMİ Ders 11: PL/SQL’e Giriş Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği
PL/SQL PL/SQL ile ilgili özet bilgiyi Ders 9 – Slayt 22’de bulabilirsiniz. Bir PL/SQL bloğunun öncesinde eğer gerekli ise değişkenlerin tanımlanabileceği bir tanımlama kısmı, bloğun sonunda ise eğer gerekli ise bir hata işleme kısmı bulunur (END; öncesinde verilmelidir) . PL: Procedural Language
Blok Tipleri Anonim Prosedür Fonksiyon
Değişkene blok içinde değer atarken de := operatörü kullanılır. Değişken Tanımlama Sentaks: Değişkene blok içinde değer atarken de := operatörü kullanılır. Örnekler:
PL/SQL Bloğu Örneği Değişkene SELECT ile değer atama DECLARE qty_on_hand NUMBER(5); BEGIN SELECT quantity INTO qty_on_hand FROM inventory WHERE product = 'TENNIS RACKET‘ FOR UPDATE OF quantity; IF qty_on_hand > 0 THEN -- check quantity UPDATE inventory SET quantity = quantity - 1 WHERE product = 'TENNIS RACKET'; INSERT INTO purchase_record VALUES ('Tennis racket purchased', SYSDATE); ELSE VALUES ('Out of tennis rackets', SYSDATE); END IF; COMMIT; END; Değişkene SELECT ile değer atama Tek satır açıklamalarda --, çok satır açıklamalarda ise /* ve */ kullanılır NOT: IF-koşul-THEN-ifade-ELSE-ifade-END IF yapısı dışında, çok koşullu ifadeler için CASE-WHEN-koşul-THEN-ifade-WHEN-koşul-THEN-ifade-…-END CASE yapısı da vardır.
FOR Döngüsü Tüm programlama dillerinde en çok kullanılan döngü ifadesi olan For döngüsünün, PL/SQL’de kullanımı aşağıdaki gibidir: FOR değer IN baslangiç..bitiş LOOP … işlemler … END LOOP; Örnek: FOR num IN 1..500 LOOP INSERT INTO roots VALUES (num, SQRT(num));
WHILE Döngüsü WHILE koşul LOOP … işlemler … [EXIT WHEN koşul] END LOOP; EXIT-WHEN ifadesi FOR döngüsünde de kullanılabilir. İstenirse FOR veya WHILE yazılmadan, düz bir LOOP … END LOOP döngüsü yaratılabilir. Bu döngüden çıkmak için EXIT-WHEN kullanımı şarttır.
Cursor Bir sorgu sonucunda birçok kayıt elde edilmişse, bu kayıtları sıra ile işlemek için Cursor yapısı kullanılır. Programlama dillerinde kullanılan recordset (resultset) yapısına benzerdir. DECLARE CURSOR c1 IS SELECT empno, ename, job FROM emp WHERE deptno = 20;
FOR Döngülerinin Cursor ile kullanımı DECLARE CURSOR c1 IS SELECT ename, sal, deptno FROM emp; ... BEGIN FOR emp_rec IN c1 LOOP sal_total := sal_total + emp_rec.sal; END LOOP; END;
Hata İşleme DECLARE ... comm_missing EXCEPTION; -- declare exception BEGIN IF commission IS NULL THEN RAISE comm_missing; -- raise exception END IF; bonus := (salary * 0.10) + (commission * 0.15); EXCEPTION WHEN comm_missing THEN ... -- process the exception
%TYPE ve %ROWTYPE Eğer bir değişkenin tanımı verilirken, veritabanı tablolarından birindeki bir niteliğin veri türünde olması isteniyorsa %TYPE kullanılır: değişken_adı tablo_adı.sütun_adı%TYPE; Eğer bir nitelik değil de bir tablo yada cursor’daki bir kayıt söz konusu ise %ROWTYPE kullanılır: dept_rec dept%ROWTYPE; Kaydın alanlarına ulaşmak için nokta notasyonu kullanılır: my_deptno := dept_rec.deptno;
Örnek 1 DECLARE salary emp.sal%TYPE := 0; mgr_num emp.mgr%TYPE; last_name emp.ename%TYPE; starting_empno emp.empno%TYPE := 7499; BEGIN SELECT mgr INTO mgr_num FROM emp WHERE empno = starting_empno; WHILE salary <= 2500 LOOP SELECT sal, mgr, ename INTO salary, mgr_num, last_name FROM emp WHERE empno = mgr_num; END LOOP; INSERT INTO temp VALUES (NULL, salary, last_name); COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN INSERT INTO temp VALUES (NULL, NULL, 'Not found'); END; 7499 numaralı çalışanın yöneticisinden başlayıp üst yöneticilere doğru arama yapan döngü, maaşı 2500 yada daha fazla olan ilk yöneticiyi bulduğu zaman sonlanır. Bulunan yöneticinin maaşı ve soyadı temp tablosuna eklenir. Bulunamaz ise maaş NULL olarak, soyad ise ‘Not found’ olarak eklenir.
Örnek 2 PROCEDURE award_bonus (emp_id NUMBER) IS bonus REAL; comm_missing EXCEPTION; BEGIN SELECT comm * 0.15 INTO bonus FROM emp WHERE empno = emp_id; IF bonus IS NULL THEN RAISE comm_missing; ELSE UPDATE payroll SET pay = pay + bonus END IF; EXCEPTION WHEN comm_missing THEN... END award_bonus; “award_bonus” prosedürü, parametre olarak aldığı çalışan numarası ile o çalışanın komisyon miktarını bularak, bu komisyon miktarının %15’ini bonus değişkenine atar. Eğer komisyon (comm) NULL ile, bonus değişkeni de NULL olur ve işlem yapılmadan hata bloğuna gidilir. Eğer komisyon NULL değilse çalışanın ücret bordrosundaki (payroll tablosu) ödeme (pay) alanı bonus kadar arttırılır.