PL/SQL Collections

Collection koleksiyon veya bir topluluk olarak çevrilebilir. Collection’lar içerlerinde aynı tip bir yada birden çok data bulundururlar. PL/SQL ‘de üç tip collectiondan söz edebiliriz.

  • Index-by tables or Associative array
  • Nested Table
  • Variable-size array or Varray

Associative Array

Associative Array’ler PL/SQL ‘de dinamik array yapılarıdır. Programlama dillerinden hatırladığımız üzere arraylerin başlangıçta initiliaze edilme ve eleman sayısının belirlenme durumu söz konusudur. Associative array’lerde böyle zorunluluklar söz konusu değildir. Array’i doğrudan içine tutacağı eleman sayısını belirlemeden ve initiliaze etmeden  yaratıp istediğimiz indisine eleman ekleyebilme olanağına sahibiz. Bunun yanı sıra klasik array mantığımızda var olan indis’in yalnızca sayısal değer olabilme kısıtı Associative Array yapısında yoktur. Bu durumu açıcak olursak, array’in içerisinde hareket etmemizi sağlan indis string veya integer olabilmekte. İndis tipini “index by” söz deyimi ile tanımlayabilmekteyiz

PL/SQL’de collection yaratabilmemiz için öncelikle TYPE söz deyimi ile bir tip tanımlayı daha sonra bu tip üzerinden bir değişken tanımlamamız gerekmektedir.

Yaratmak istediğimiz tipin array olacağını ise “is table of”  söz deyimi ile gerçekleştirmekteyiz.

DECLARE
   TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
   salary_list salary;
   name   VARCHAR2(20);
BEGIN
   -- adding elements to the table
   salary_list('Rajnish')  := 62000;
   salary_list('Minakshi')  := 75000;
   salary_list('Martin') := 100000;
   salary_list('James') := 78000;

   -- printing the table
   name := salary_list.FIRST;
   WHILE name IS NOT null LOOP
      dbms_output.put_line
      ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name)));
      name := salary_list.NEXT(name);
   END LOOP;
END;
/
DECLARE
   CURSOR c_customers is select  name from customers;

   TYPE c_list IS TABLE of customers.name%type INDEX BY binary_integer;
   name_list c_list;

   counter integer :=0;
BEGIN
   FOR n IN c_customers LOOP
      counter := counter +1;
      name_list(counter)  := n.name;
      dbms_output.put_line('Customer('||counter|| '):'||name_list(counter));
  END LOOP;
END;
/

(devamı..)

Loading


PL/SQL PACKAGES

Package olarak bahsettiğimiz yapılar çeşitli PL\SQL tiplerinin, fonksiyonların, procedure’leriin ve alt programcıkların toplandığı object’lerdir. Peki neden package ihtiyaç duyarız mesela küçük sistemlerde oluşturduğunuz procedure ve function yapılarının kontrolü çok büyük bir problem çıkarmayacaktır fakat büyük sistemlerde belki yüzlerce,binlerce function ,procedure ,varray ,record vs bulunabilir, bu tür büyük sistemlerde kodları mantıksal olarak bir araya toplamak ve kolay erişimi sağlamak amacı ile paketler kullanılır. Örnek vermek gerekirse bir bankada core finans için bir package, CRM için bir package, emeklilik sistemi için bir package gibi düşünebiliriz. Bu bilgilerden yola çıkarak package’ın avantajları olarak aşağıdakileri düşünebiliriz;

  • Kullanım kolaylığını sağlar.
  • Uygulama dizaynını kolaylaştırır.
  • Modülerliği sağlar.
  • Performansı artırır.

Paket yapılarının zorunlu olan iki alanı vardır.

  1. Specification
  2. Body

Specification : Package’in interface(arayüz)’i olarak düşünebilirsiniz. Paket içerisinde bulunan fonksiyon ve prosedürlerin içerik bilgisi haricinde sadece tipi ve aldığı parametreleri gördüğümüz kısımdır. Paket oluştururken ilk önce Spec kısmı oluşturulur.

CREATE PACKAGE cust_sal AS
   PROCEDURE find_sal(v_id hr.employees.employee_id%type);
END cust_sal;
/

Body : Paketin gövdesidir. Tüm tanımlamalar, fonksiyonlar ,prosedürler bu kısımda yazılır. Spec içerisinde tanımlanan yapıların içerikleri burada bulunur. Spec kısmı oluşturulan paketin body içeriğini aşağıdaki gibi oluştururuz.

CREATE OR REPLACE PACKAGE BODY cust_sal AS
   PROCEDURE find_sal(v_id hr.employees.employee_id%TYPE) IS
   v_sal hr.employees.salary%TYPE;
   BEGIN
      SELECT salary INTO v_sal FROM hr.employees WHERE id = v_id;
      dbms_output.put_line('Salary : '|| v_sal);
   END find_sal;
END v_sal;
/

(devamı..)

Loading


PL/SQL TRIGGERS

Trigger’ın türkçe karşılığı tetikleyici’dir. PL/SQL’de yazılıp saklanan yapılardır. Triggerlar yazılır ve yazılma aşamasında belirtilen koşullarda otomatik olarak çalışır. Örnek olarak tabloya bir kayıt eklediğimizde otomatik olarak kayıt tarihi olarak sistem tarihinin atması ya da tabloda bir güncelleme veya silme yaptığımızda ilgili kayıt için başka bir tabloya log kaydı atması gibi çeşitli sebepler ve kontroller için triggerlara ihtiaç duyarız.

Triggerlar aslında bir prosedürdür fakat prosedürlerden farkı Oracle tarafından çağrılmasıdır. Prosedürler bir trigger ,bir uygulama ya da kullanıcı tarafından çağrılan yapılardır. Yani trigger’lar SQL ve PL\SQL ifadelerini içerebilirler ve diğer PL\SQL birimlerini çağırabilirler, veritabanında saklanırlar, belirli durumlarda çağırılırlar.

Trigger’lar veritabanında tablolardan farklı bir yerde tutulurlar. Ayrıca triggerlar  sadece tablolar üzerinde tanımlanabilirler ve tanımlandıktan sonra tabloya eklenecek veriler ile ilgilenir öncesi için bir kontrol yapmaz. View’lar üzerine tanımlanamasalarda, view’ların üzerinde bir değişiklik yapılmaya çalışıldığında view’ın üzerine tanımlandığı tablolarda kaydedilmiş trigger’lar çalıştırılır.

Trigger’ın Tetiklendiği Durum Tipleri ;

  • Herhangi bir DML ifadesi : INSERT, UPDATE, DELETE
  • Herhangi bir DDLifadesi: CREATE, ALTER, DROP
  • Herhagi bir veritabanı işleminde: Örnek olarak Logon, Logoff, Startup, Shutdown işleminde.

Trigger’in Faydaları ;

  • Sütunlar için otomatik olarak değerler üretmesi
  • Güvenlik katmanı oluşturmak için
  • Loglama
  • Yapılan işlemlerle ilgili kayıt oluşturmak için
  • Tablolar arasında eşleme ve eşitleme yapmak için
  • Tablo erişimiyle ilgili bilgiler toplamak için
  • Uygun olmayan transaction’ları engellemek için

(devamı..)

Loading


PL/SQL EXCEPTIONS

Exception kelimesinin Türkçe karşılığı istisna demektir ve PL/SQL ‘de hataları yakalamak için kullanılan yapıya bu ad verilir. Exception blokları sayesinde kod içerisinde karşılaşılması öngörülen hatalar yakalanıp gerekli işlemler yapılabilir.

Eğer programımızda hata kontrolü yoksa programın çalışması durur ve programın kontrolü işletim sistemine döner. Hata kontrolü varsa da program hatalara rağmen devam edebilir.

Exception iki türlü tanımlanabilir :

  1. Sistem Tanımlı Exceptionlar(System Defined Exceptions)
  2. Kullanıcı Tanımlı Exceptionlar(User Defined Exceptions)

Kullanıcı Tanımlı Exceptionlar(User Defined Exceptions)

Bir uygulama yazıyorsunuz ve bu uygulamaya özel bazı hatalarınız oluşuyor ve bunları yakalamak ,ekrana bilgi vermek ya da loglamak istiyorsunuz. Bu gibi durumlarda PL/SQL sadece sistem tanımlı olan exceptionları değil kendi tanımladığınız hatalarınızı da yakalama şansı veriyor.

PL/SQL de hata tanımlaması yaparken aşağıdaki sintaksisi kullanıyoruz ;

DECLARE
   my-exception EXCEPTION;

Aşagıdaki örnekte bir exception tanımlıyoruz id’yi sıfır’ın altında girersek ex_invalid_id  exceptionu çalışacak.Başka bir hata durumunda ise tanımlı gelen exceptionlardan birisi çalışacak.

NOT :  Exception’ı hata olarak yakalaması için RAISE ifadesini kullandık. Raise’in karşılığı ‘uyandırmak’ olarak düşünülebilir ve burada ‘git ve oluşturduğum hatayı uyandır cevabını versin’ diyorsunuz

DECLARE
   v_id hr.employees.employee_id%type := &cc_id;
   v_name  hr.employees.first_name%type;
   v_surn hr.employees.last_name%type;

   -- exception tanimlariz
   ex_invalid_id  EXCEPTION;
BEGIN
   --exception sartini belirtiriz
   IF v_id <= 0 THEN
      RAISE ex_invalid_id;
   ELSE
      SELECT  first_name, last_name INTO  v_name, v_surn
      FROM hr.employees
      WHERE employee_id = v_id;

      DBMS_OUTPUT.PUT_LINE ('Name: '||  v_name);
      DBMS_OUTPUT.PUT_LINE ('Surname: ' || v_surn);
   END IF;
EXCEPTION
   --tanimladigimiz exception ise
   WHEN ex_invalid_id THEN
      dbms_output.put_line('ID must be greater than zero!');
   WHEN no_data_found THEN
      dbms_output.put_line('No such customer!');
   WHEN others THEN
      dbms_output.put_line('Error!');
END;
/

(devamı..)

Loading


PL/SQL Kayıt(RECORD)

Birbiri ile ilgili, farklı tiplerde olan verilerin tutulduğu yapılardır. Diğer Programlama dillerindeki Class(Java, C# vb.), Structure  (C ) gibi düşünülebilir. PL/SQL ‘de bu yapı ile birlikte farklı tiplerdeki verileri tutabiliyoruz ve çok büyük kolaylıklar sağlıyor bizlere. Farklı tipler derken farklı veri tiplerini kast ediyorum. Mesela bir kişiye ait iletişim bilgilerini tutacaksınız ve bu iletişim bilgilerinin içinde telefon numarası (number),e_mail (varchar),adres(varchar) var ve bunları bir arada tutmak istiyorsunuz. İşte bu gibi durumlarda Record yapısı işimize çok yarayacak.

  • Pl/Sql’de veritabanı ile iletişimde olan tipler tanımlamaktan bahsedersek %TYPE ve %ROWTYPE niteleyicilerini kullanabilirsiniz.
  • Record içindeki veri tipleri varchar2, date, number olabilir.
  • %Type ile istenilirse tablodaki bir kolonun veri tipi ile de eşleştirilebilir. Bu sayade ilgili tabloda ilgili kolonun veri tipi değiştiğinde bizim RECORD’umuz yeni veri tipini otomatik olarak algılayacaktır.
  • %RowTypeile belirtilen tablodaki tüm kolona adları ve veri tipleri ile Record oluşturulabilir. Tabloda herhangi bir değişiklik olması durumunda %RowType ile tanımlanan Record bu değişikliği otomatik olarak algılayacaktır.
  • Record içindeki veri tiplerinde “Not Null”  ve  “Default” Constraintlerini kullanabilirsiniz.
  • Record tanımlanırken daha önceden tanımlanmış bir Record Alan Adı olarak kullanılabilir (Nested Record).
  • Recordlar veritabanında tutulmazlar.
  • Tanımlanan  Record bir Fonksiyon(Function) için dönen değer olarak kullanabilir
  • Recordlar Prosedür(Procedure) ve Fonksiyonlar için “In” ve/veya  “Out” parametresi olarak kullanılabilir
  • Recordlardaki Alan Adları Tekil Olmak Zorunda.

 

Record üç farklı yapıda oluşturulabilir:

  • Tablo Tabanlı (Table Based)
  • Cursor Tabanlı (Cursor Based)
  • Kullanıcı tanımlı (User Defined)

(devamı..)

Loading


PL/SQL CURSOR

Cursor bir küme içinde bulunan verileri işaret eden ve cursor çeşidine göre verileri,sayısını,verinin olup olmadığını vs. bilgileri bize sunan yapılardır.Yani Cursor birden çok veriyi memory de tutup yorumlayabilmemizi sağlar. Nasıl ki değişkenler tek bir adet veriyi tutuyorsa , cursor ‘lerde bir çok veriyi hatta tabloları tutabilen pl/sql yapılarıdır.  PL/SQL ‘de bulunan iki tip cursor yapısı vardır.

  1. Implicit(Örtülü) Cursor
  2. Explicit(Açık) Cursor

Implicit(Örtülü) Cursor

Implicit Cursor  SQL cümlecikleri çalıştırıldığında Oracle tarafından (eğer explicit cursor yoksa) çalıştırılırlar. Programcı bu yapıya müdahale edemediği için implicit cursor(örtülü gösterge) deniliyor. Programcı bu göstergelere müdahale edemez fakat aşağıdaki tablo da açıklamaya çalıştığım fonksiyonlar ile bazı bilgiler edinebilir. Fonksiyonlardan önce aşağıdaki şekli de sizlere kısaca açıklayayım. PL/SQL bloklarının içerisinde diğer yazılarda gördüğünüz gibi SQL cümlelerini de kullanıyoruz.Oracle normalde PL/SQL Engine ile işe başlar fakat eğer arada SQL sorguları var ise SQL Engine ‘e gidip sorguyu çalıştırıp tekrar PL/SQL Engine’e döner. Aslında implicit cursor’lar işte bu geçişlerdeki verileri tutmaya yarar.

PL/SQL CURSOR - PL/SQL Implicit Cursor - PL/SQL Örtülü Cursor

Şimdi bu geçişte tutulan veriler hakkında aşağıdaki fonksiyonlar ile ne kadar bilgi edinebileceğimizi görelim.

Fonksiyon Açıklama
%FOUND Eğer INSERT, UPDATE, ya da  DELETE işlemlerinden bir veya daha fazla satır etkilendiyse TRUE döner veya SELECT INTO işleminden bir veya birden fazla satır etkilendiyse TRUE döner. Bunların dışında FALSE döner.
%NOTFOUND Mantıksal olarak FOUND işleminin tam tersidir.
%ISOPEN Implicit Cursorlar için herzaman FALSE döner çünkü Oracle SQL sorgusu biter bitmez otomatik olarak cursor’ı kapatır.Yani bu fonksiyon cursor kapalı mı değil mi bunu kontrol eder.
%ROWCOUNT INSERT,UPDATE,DELETE işlemlerinden etkilenen satur sayısını ve INSERT INTO işleminde insert edilen kayıt sayısını döndürür.

(devamı..)

Loading


  • Sertifikasyon



  • Etiketler

  • Topluluklar

                     
                     
  • Copyright © 1996-2010 Mustafa Bektaş Tepe. All rights reserved.
    Türkçeleştirme Blogizma | AltyapıWordPress