PL/SQL

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)

(continue reading…)

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.

(continue reading…)

Loading


PL/SQL FONKSİYONLAR(FUNCTIONS)

Prosedürleri öğrenirken fonksiyonlarla ilgili olarak geriye bir değer döndürür demiştik.

Yeri gelmişken internette karşılaştığım prosedür  veya fonksiyonların önemiyle ilgili güzel bir örnek; Bir işlemi birden çok yaptığınızı düşünün. Her seferinde aynı işlemi yapan kodu yazmak oldukça zahmetli olurdu. Fonksiyonlar veya prosedürler, bu soruna yönelik yaratılmıştır. Sadece bir kereye mahsus yapılacak işlem tanımlanır. Ardından dilediğiniz kadar, bu fonksiyonu çağırırsınız. Üstelik fonksiyonların yararı bununla da sınırlı değildir. Fonksiyonlar, modülerlik sağlar. Sayının asallığını test eden bir fonksiyon yazıp, bunun yanlış olduğunu farkederseniz, bütün programı değiştirmeniz gerekmez. Yanlış fonksiyonu düzeltirsiniz ve artık programınız doğru çalışacaktır. Üstelik yazdığınız fonksiyonlara ait kodu, başka programlara taşımanız oldukça basittir.

Bir fonksiyon  aşağıdaki şekilde oluşturulur.

CREATE [OR REPLACE] FUNCTION fonksiyon_adi
[(parametre_adi[IN | OUT | IN OUT] parametre_tipi [, ...])]
RETURN donen_degiskenin_tipi
{IS | AS}
BEGIN
   < fonksiyonun gövdesi>
END [fonksiyon_adi];

(continue reading…)

Loading


PL/SQL PROSEDÜRLER (PROCEDURES)

Pl/SQL’in bir prosedürel(yordamsal) bir dildir ve zaten ismini de buradan almıştır. Yordamların da alt programlar(subprogram) olduğunu ve bu alt programların bir araya gelerek  daha büyük kodları meydana getirdiğini söyleyebiliriz. Alt programlar bağımsız(standalone) veya bir paket(package) içerisinde oluşturulabilir. Paket konusunu ileride anlatacağım için bağımsız alt programlar ile devam edeceğiz.

Bağımsız alt programlar  CREATE PROCEDURE ve CREATE FUNCTION şeklinde oluşturulabilir ve silmek için ise  DROP PROCEDURE ve DROP FUNCTION  işlemlerini kullanarak yapabiliriz. Fonksiyonlar konusunu ayrıntılı bir şekilde işleyeceğiz fakat yordamları anlamak için fonksiyon tanımı bize yararlı olacak.

Fonksiyon :  Fonksiyonlar parametre alan ve tek bir değer döndüren alt programlardır.

Prosedür  :  Prosedürler parametre alabilen fakat geriye herhangi bir değer döndürmeyen alt programlardır.

NOT : Şunu da söyleyebiliriz: İşlev açısından prosedürler java/c#’taki void metodlara, fonksiyonlar ise değer dönen (string, int, bool vs.) metodlara benzer.

Prosedür oluştururken kullanacağımız yapı aşağıdaki gibidir.

CREATE [OR REPLACE] PROCEDURE yordam_adı
[(parametre_adı [IN | OUT | IN OUT] parametre_tipi [, ...])]
{IS | AS}
BEGIN
  < yordam gövdesi >
END yordam_adı;

(continue reading…)

Loading


PL/SQL DİZİ (ARRAY)

VARRAY aşağıdaki şekildende anlaşılacağı gibi birden fazla aynı tipte degişkeni bir dizi içinde hafızada(memory) ard arda tutan yapıdır(koleksiyon).

Array’ın faydasını anlamak için internette bulduğum bir örneği kullanacak olursak çok daha iyi anlaşılacağını düşünmekteyim; bir bilgisayar programı yaptığınızı düşünün. Kullanıcının 100 değer girmesi isteniyor. Girilen bütün bu sayıların farklı aşamalardan geçeceğini ve bu yüzden hepsini ayrı bir değişkende tutmamız gerektiğini varsayalım. Bu durumda ne yapardınız? a0, a1, a2, …, a99 şeklinde 100 tane değişken tanımlamak elbette mümkün; ama oldukça zahmetli olurdu. Sırf değişkenleri tanımlarken kaybedeceğiniz zamanı düşünürseniz ne demek istediğimi anlarsınız. Bunun için alternatif bir çözümün gerektiği mutlak!

Çok sayıda değişkenin gerektiği durumlarda, diziler imdadımıza yetişir. (Dizi, İngilizce kaynaklarda array olarak geçer.) 100 değişken tanımlamamızın gerektiği yukardaki örneğe dönelim. Tek tek a0, …, a100 yaparak bunu nasıl yazacağınızı zaten biliyorsunuz. Şimdi tek satırda dizi tanımlayarak, bunu nasıl yapacağımızı görelim:

CREATE OR REPLACE TYPE test_array IS VARRAY(100) of number;

PL/SQL DİZİ - PL/SQL ARRAY

Varray aslında bir veri tipidir ve  bunu oluşturmak için aşağıdaki formatı kullanıyoruz.

CREATE OR REPLACE TYPE varray_ismi IS VARRAY(n) of<elementp_tipi>

NOT : PL/SQL bloğunun içinde dizileri(array) aşağıdaki gibide oluşturabiliriz.

TYPE varray_ismi IS VARRAY ( n ) OF < element_tipi >
  • varray_ismi   : varray’e vereceğimiz isimdir.
  • n                    : varray’in maksimum eleman sayısı
  • element_tipi : varray’in içindeki elemanların tipinin ne olacağı.

Örnek;

CREATE OR REPLACE TYPE namearray AS VARRAY (3) OF VARCHAR2 (10);
TYPE namearray IS VARRAY(5) OF VARCHAR2(10);
Type grades IS VARRAY(5) OF INTEGER;
DECLARE
   type namesarray IS VARRAY(5) OF VARCHAR2(10);
   type grades IS VARRAY(5) OF INTEGER;
   names namesarray;
   marks grades;
   total integer;
BEGIN
   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
   marks:= grades(98, 97, 78, 87, 92);
   total := names.count;
   dbms_output.put_line('Total '|| total || ' Students');
   FOR i in 1 .. total LOOP
      dbms_output.put_line('Student: ' || names(i) || 'Marks: ' || marks(i));
   END LOOP;
END;
/

Yukarıdaki örnekte isimlerin tutulduğu namesarray‘i ve isimlere ait notların tutulduğu grades‘imiz var. Görüldüğü gibi oluşturduğumuz değişkenlerin tipini oluşturduğumuz varray tipinde(names ve marks) tanımlıyoruz. Ardından oluşan array’imizin elemanlarını tanımlıyoruz. Ardından da döngüler de öğrendiğimiz  for loop ile array’in eleman sayısı kadar (count ifadesi ilgili arrayin kaç elemandan oluştuğu bilgisini verir) ekrana isimleri ve notları yazdırıyoruz.

Örnek 2;

PL SQL DİZİ - PL SQL ARRAY

DECLARE
   CURSOR c_test_array is
   SELECT  name FROM test_array;
   type c_list is varray (6) of test_array.name%type;
   name_list c_list := c_list();
   counter integer :=0;
BEGIN
   FOR n IN c_test_array LOOP
      counter := counter + 1;
      name_list.extend;
      name_list(counter)  := n.name;
      dbms_output.put_line('Customer('||counter ||'):'||name_list(counter));
   END LOOP;
END;
/

Yukarıda da görüldüğü gibi tablonun name sütununu bir diziye(array) atıyor ve kullanıyoruz.

NOT : yukarıdaki 2 örnektede count ve extend metodunu kullandık bu metodların hepsini koleksiyon(collection) konusunda göreceğiz.

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

Kaynaklar;
http://www.tutorialspoint.com/plsql/plsql_basic_syntax.htm
https://developersdaily.wordpress.com
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


PL/SQL Döngüler (LOOPS)

Bir veya birden fazla işlem satırını, bir koşula bağlı olarak, belirli sayıda veya bir koşul sağlandığı sürece tekrarlayarak çalıştıran kalıplara döngü adı verilir. Yani aşağıda görünen şekil gibi koşulumuz sağlanıyorsa döngümüz devam edecek sağlanmıyorsa döngü sonlanacaktır.

PL/SQL Döngüler - PL/SQL LOOPS

Döngü Tipi Açıklama
PL/SQL Basic LOOP PL/SQL Temel LOOP yapısında koşulumuz sağlanmadığında loop içinden çıkma komutu ile döngümüzü bitiririz.
PL/SQL While LOOP WHILE LOOP mantığında ise basic loop ile aynı şekilde çalışır fakat burada şart sağlanmadan loop içine giremezsiniz basic loop içerisinde 1 defa girilmiş oluyor.
PL/SQL FOR LOOP FOR LOOP yapısında belirlediğimiz sayıda loop içinde dönebiliriz.
PL/SQL Nested loop İç içe loop kullanımı gerçekleştirebilriz.

(continue reading…)

Loading


  • Sertifikasyon



  • Etiketler

  • Topluluklar

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