Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

Veri Tabanı Yönetim Sistemleri 2 Ders 5 PL/SQL'e Giriş, Prosedür ve Fonksiyonlar Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.

Benzer bir sunumlar


... konulu sunumlar: "Veri Tabanı Yönetim Sistemleri 2 Ders 5 PL/SQL'e Giriş, Prosedür ve Fonksiyonlar Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği."— Sunum transkripti:

1 Veri Tabanı Yönetim Sistemleri 2 Ders 5 PL/SQL'e Giriş, Prosedür ve Fonksiyonlar Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği Bölümü

2 PL/SQL nedir? Oracle İVTYS üzerinde kullanılmak üzere, ADA programlama dili temel alınarak geliştirilen standart SQL'e prosedürel dil özellikleri eklenerek oluşturulmuş dildir.

3 SQL ile PL/SQL’in arasındaki temel fark: SQL declarative ve 4GL bir dildir. Yani doğal dile yakındır. Kullanıcı ne yapmak istediğini yazar, nasıl yapılacağının adımlarını ayrıntılı olarak vermez. – Ahmet SOLMAZ isimli personelin maaşını bulmak için basit bir SELECT ifadesi yazmak yeterlidir. PL/SQL ise C/C++ gibi 3GL bir dildir. Doğal dile daha uzaktır. İşlemin adımları açıkça yazılmalıdır. – Ahmet SOLMAZ isimli personelin maaşını bulmak için C dilinde önce bir dosyayı açıp, dosya sonuna kadar bir döngü ile bu personeli arayıp, ilgili kaydı bulduğunuzda maaş alanını döndürmek için uzun bir kod yazarsınız. SQL bir sorgulama dili, PL/SQL ise bir programlama dili olarak nitelendirilebilir.

4 Neden PL/SQL Kullanırız? Bazı durumlarda işlemin «nasıl» yapılacağını vermek gerekebilir.* Birçok SQL komutunu bir blok içinde toplayarak tek seferde veritabanına göndermek performans artışı sağlayabilir. İşletim sisteminden ve platformdan bağımsız olmak üzere Oracle sunucusunun olduğu her ortamda çalışabilmesi nedeniyle PL/SQL saklı yordamlarını kullanmak esneklik sağlar. «Exception Handling» mekanizmasına sahip olduğu için hata durumlarında yapılacak işlemleri tanımlayabiliriz. * SQL’in hangi durumda yetersiz kalabileceği hakkında bir örnek için: Database Programming with PL/SQL, Section 1, Lesson 1, Slayt 8-13

5 PL/SQL Bloğu Bir PL/SQL bloğu BEGIN ile başlar ve END; ile biter. Blok içinde değişkenler kullanılacak ise BEGIN öncesinde DECLARE ile başlayan bir tanımlama kısmında tanımlanmalıdırlar. Bloğun sonunda eğer gerekli ise EXCEPTION ile başlayan bir hata işleme kısmı bulunabilir (END; öncesinde verilmelidir).

6 Blok Tipleri Anonim Prosedür Fonksiyon

7 Prosedürel Yapılar PL/SQL'de aşağıdaki prosedürel yapılar kullanılır: – Değişkenler, sabitler ve tanımlamalı veri tipleri – Kontrol yapıları (If-Else, Case-When) – Döngüler (For ve While) – Bir defa yazılıp birçok defa kullanılabilen programlama elemanları (Fonksiyonlar ve Prosedürler)

8 Değişken Tanımlama Değişkene blok içinde değer atarken de := operatörü kullanılır. Sentaks: Örnekler: Veri Tipleri hakkında detaylı bilgi için: Database Programming with PL/SQL, Section 2, Lesson 3, Recognizing Data Types

9 PL/SQL Bloğu Örnekleri Sistem tarihini gösterme: BEGIN DBMS_OUTPUT.PUT_LINE('Bugün = ' || SYSDATE); END; Değişkene atayarak sistem tarihini gösterme: DECLARE v_date DATE := SYSDATE; BEGIN DBMS_OUTPUT.PUT_LINE('Bugün = ' || v_date); END;

10 %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; last_name emp.ename%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; %TYPE hakkında bilgi için: Section 2, Lesson 4, Using Scalar Data Types %ROWTYPE hakkında bilgi için: Section 5, Lesson 2, Using Explicit Cursor Attributes

11 IF-THEN-ELSIF-ELSE Koşula göre işlem yapmak için IF-THEN-ELSE kullanılabilir: NOT: "ELSE IF" yazımı ELSIF şeklindedir. Detaylı bilgi için: Section 4, Lesson 1, Conditional Control: IF Statements

12 Örnek 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 INSERT INTO purchase_record VALUES ('Out of tennis rackets', SYSDATE); END IF; COMMIT; END; Değişkene SELECT sorgusu ile değer atama INTO ile yapılır Tek satır açıklamalarda --, çok satır açıklamalarda ise /* ve */ kullanılır NOT: Normalde SELECT ile yapılan sorgular veriyi kilitlemez iken, sorguda kullanılan FOR UPDATE OF quantity; satırı sayesinde sorgu sonrasında quantity alanı kilitlenir. UPDATE + COMMIT sonrasında kilit kaldırılır. (bak: SQL Fundamentals I – Les09 – Slayt 43-44)

13 CASE WHEN Bir değişkene atanacak değeri belirli bir koşula göre belirlemek için CASE WHEN kullanılabilir: Detaylı bilgi için: Section 4, Lesson 2, Conditional Control: Case Statements

14

15 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 LOOP INSERT INTO roots VALUES (num, SQRT(num)); END LOOP; Detaylı bilgi için: Section 4, Lesson 4, Iterative Control: WHILE and FOR Loops

16 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. Detaylı bilgi için: Section 4, Lesson 4, Iterative Control: WHILE and FOR Loops

17 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; Detaylı bilgi için: Database Programming with PL/SQL, Section 5

18 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;

19 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 END; Detaylı bilgi için: Database Programming with PL/SQL, Section 7

20 Örnek DECLARE e_invalid_department EXCEPTION; v_name VARCHAR2(20):='Accounting'; v_deptno NUMBER := 27; BEGIN UPDATE departments SET department_name = v_name WHERE department_id = v_deptno; IF SQL%NOTFOUND THEN RAISE e_invalid_department; END IF; COMMIT; EXCEPTION WHEN e_invalid_department THEN DBMS_OUTPUT.PUT_LINE('No such department id.'); ROLLBACK; END;

21 Genel Hataların İşlenmesi DECLARE v_country_name VARCHAR2(40); v_region_id NUMBER; BEGIN SELECT country_name, region_id INTO v_country_name, v_region_id FROM countries WHERE country_id='CA'; DBMS_OUTPUT.PUT_LINE ('The country name is: ' ||v_country_name||' and is located in ' ||v_region_id||'.') ; EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE ('Your select statement retrieved multiple rows. Consider using a cursor.'); END; EXCEPTION veri tipi ile tanımlanmamış ve RAISE ile çağrılmamış genel hatalar için tanımlanan sabitlerden biridir. Bu kısım silinirse tüm ülkeler seçileceği için değişkenlere atanacak değerlere karar verilemez ve EXCEPTION’a gidilir. Bak: Predefined Oracle Server Errors Database Programming with PL/SQL, Section 7, Slayt 11-14

22 Örnek 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'); COMMIT; END; genel hatalar için tanımlanan sabitlerden bir başkası

23 Stored Procedure (Saklı Yordam) Stored Procedure’ler veritabanında saklanan ve gerektiğinde ismi ile çağrılabilen PL/SQL bloklarıdır. Değer döndüren prosedürlere fonksiyon (function) denir. Önceden derlenmiş olduğu için, normal kullandığımız bir SQL sorgusunun tekrar tekrar çalıştırılmasına nazaran daha fazla performans elde etmemizi sağlarlar. Server üzerinde tutulduğundan, yükü istemci tarafına değil de, sunucu tarafına yükleyerek programımızın performansını arttırır. (Elbette ki bu bir seçimdir. Sunucunuz güçlüyse bu seçimi tercih edebilirsiniz.) Prosedürler hakkında detaylı bilgi için: Database Programming with PL/SQL, Section 8

24 Stored Procedure (Devam …) Bir kez yazılıp, tekrar tekrar kullanıldığı için modüler bir yapıda program geliştirmiş oluruz. Aynı PL/SQL ifadesini birden fazla yerde kullanacağımız zaman, bunu bir saklı yordam haline getirerek, kullanımını sadece ismini çağırma ile gerçekleştirebiliriz. Belirli girdi ve çıktı parametreleri olduğu için, saklı yordamların kullanımı ile güvenlik açısından kendimizi sağlama almış oluruz. Ağ trafiğini azaltır. İstemci tarafından birçok satıra sahip SQL komutunun sunucuya gitmesindense, sadece saklı yordamın adının sunucuya gitmesi ağı daha az meşgul etmiş olur.

25 Parametresiz Stored Procedure CREATE PROCEDURE print_date IS v_date VARCHAR2(30); BEGIN SELECT TO_CHAR(SYSDATE,'Mon DD, YYYY') INTO v_date FROM DUAL; DBMS_OUTPUT.PUT_LINE(v_date); END; IS yerine AS de yazılabilir Tarihi karaktere dönüştüren TO_CHAR fonksiyonunun ikinci parametresi formatı belirler. Built-in ORACLE fonksiyonları hakkında detaylı bilgi için: Section 2, Lesson 5, Writing PL/SQL Executable Statements

26 Parametreli Stored Procedure CREATE PROCEDURE para_yatirma (hes_no IN NUMBER, miktar IN NUMBER) AS BEGIN UPDATE hesaplar SET bakiye = bakiye + miktar WHERE hesap_no = hes_no; END; Prosedürler SQL Plus veya SQL Developer altında EXEC (veya EXECUTE) ile çağrılabilir. Fakat Web tabanlı «Oracle Application Express» altında begin/end bloğu içinde yazılarak çağrılırlar. EXEC para_yatirma(123, 1000); BEGIN para_yatirma(123, 1000); END;

27 CREATE PROCEDURE award_bonus (emp_id NUMBER) IS bonus NUMBER(10,2); 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 WHERE empno = emp_id; END IF; EXCEPTION WHEN comm_missing THEN DBMS_OUTPUT.PUT_LINE('HATA: BONUS hesaplanamadı'); END award_bonus; Örnek

28 Fonksiyon Birçok programlama dilinde olduğu gibi PL/SQL’de de dile özgün hazır fonksiyonlar haricinde, kullanıcıya fonksiyon tanımlama olanağı sağlanır. Fonksiyonlar prosedürlerden farklı olarak RETURN komutu ile çağrıldıkları yere değer döndürürler. Döndüreceği veritipi ve değişken ismi BEGIN öncesinde tanımlanır. Geriye değer döndürmeyen prosedürler EXECUTE komutu ile çağrılırken, fonksiyonlar bir sorgu veya bir PL/SQL bloğu içinden çağrılabilir.

29 Parametre olarak aldığı string'teki karakter sayısını döndüren fonksiyon CREATE FUNCTION num_characters (p_string IN VARCHAR2) RETURN INTEGER IS num_chars INTEGER; BEGIN SELECT LENGTH(p_string) INTO num_chars FROM DUAL; RETURN num_chars; END; Fonksiyonlar hakkında detaylı bilgi için: Database Programming with PL/SQL, Section 9


"Veri Tabanı Yönetim Sistemleri 2 Ders 5 PL/SQL'e Giriş, Prosedür ve Fonksiyonlar Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği." indir ppt

Benzer bir sunumlar


Google Reklamları