Kullanıcı Tanımlı PL/SQL Kayıtları – Oracle Record

Oracle PL/SQL bloklarında kullanılan bir veri yapısı türüde “kayıt” yani “record” olarak isimlendirilmektedir.Bir kayıt birbirleriyle ilişkili alanların bir arada tanımlanması ile oluşturulur. Kayıtın bir adı vardır. Ayrıca tıpkı PL/SQL tablolarında olduğu gibi, bir indeks yardımıyla kayıtlara ulaşılır. Kayıtın her bir alanı farklı veri türüne sahip olabilir.

Kayıt Türünün Tanımlanması

PL/SQL kayıt türünün oluşturulması amacıyla, blokların DECLARE bloğu için bir tanım yapılması gerekmektedir. Kayıt türlerinin yaratılabilmesi için öncelikle aşağıda görüldüğü biçimde bir tür tanımı yapılmalıdır.

  • TYPE [kayıt_türü_adı] IS RECORD (alan tanımları);

Burada ki alan tanımları için bilinen pl/sql değişken tanımlama ile yapılmaktadır. Ama benim Oracle için en sevdiğim özelliklerden biri olan %TYPE ile tanımlaması, oluşturduğunuz record ile veri tabanı kolonları arasında çok güzel bir ilişki oluyor :)

Örnek:

Aşağıda bir PL/SQL kayıt türü tanımlanmaktadır. Bu kayıt, p_no, p_adi ve p_ucret gibi üç alandan oluşmaktadır. Bu kayıt türünün adı per_kayit_turu olarak belirlenmiştir.

 DECLARE
    TYPE per_kayit_turu IS RECORD (
       p_no    NUMBER(3),
       p_adi   VARCHAR2(15),
       p_ucret NUMBER );

 BEGIN
   --
 END;

Bu tanım içindeki alan türleri, bir diğer değişkenden ya da bir veri tabanı tablosunun alanlarından alınabilir. Böyle bir amaç için %TYPE anahtar kelimesini kullanıyoruz. Aşağıdaki örnek, kaydın alanlarına ait veri türlerinin personel tablosundan kopyalandığını göstermektedir:

 DECLARE
    TYPE per_kayit_turu IS RECORD (
        p_no    personel.personel_no%TYPE, -- harika
        p_adi   personel.adi%TYPE,
        p_ucret personel.ucret_no%TYPE );
 BEGIN
   --
 END;

Kaydın Tanımlanması
RECORD anahtar kelimesi kullanılarak alan türü tanımlandıktan sonra bu türe dayanarak bir kaydın yaratılması gerekmektedir. Bunun için, yine DECLARE bloğu içinde aşağıda görüldüğü biçimde bir kayıt tanımlanır:

  • kayıt_adı kayıt_türü_adı;
  • Aşağıdaki blok içinde önce bir kayıt türü tanımlıyoruz ve ardından bu türe dayanarak per_kayit isimli bir kayıt yaratıyoruz.

     DECLARE
         TYPE per_kayit_turu IS RECORD (
             p_no    NUMBER(3),
             p_adi   VARCHAR2(15),
             p_ucret NUMBER);
    
             per_kayit per_kayit_turu;
    
         BEGIN
           --
         END;
     

    Kayıtların Kullanılması
    Kayıtlar bu şekilde tanımlandıktan sonra, bu kayıtların içerdiği alanlara erişim söz konusudur. Kaydın her bir alanına, o alanın ismi kullanılarak erişilir. Bunun için şu şekilde bir tanım kullanılır:

  • kayıt_adı.alan_adı
  • Alan isimleri bu şekilde kullanılarak, bu alanlara değer atanabilir veya gerektiğinde PL/SQL bloğunun içinde kullanılabilir. Kayıt alanlarına blok içinde doğrudan değerler atanabileceği gibi, gerektiğinde veri tabanı tablolarından da veri okunarak aktarılabilir.

    Bir kayıt tanımlandıktan sonra bu kaydın alanlarına değerler kaydetmek ve ardından bu kaydın her bir alanının içeriğini görüntülemek istiyoruz.

    
      --kayıt türü tanımlanıyor
       TYPE per_kayit IS RECORD
        (per_no NUMBER(3),
         p_adi VARCHAR2(15),
         p_ucret NUMBER );
    
      --kayıt tanımlanıyor..
      per_kayit per_kayit_turu;
    
      BEGIN
       -- alanlara bilgi atanıyor
        per_kayit.per_no := 305;
        per_kayit.p_adi := 'GOKALP';
        per_kayit.p_ucret := 6650;
    
       --alanlardaki bilgiler görüntüleniyor
        DBMS_OUTPUT.PUTLINE(per_kayit.per_no);
        DBMS_OUTPUT.PUTLINE(per_kayit.p_adi);
        DBMS_OUTPUT.PUTLINE(per_kayit.p_ucret);
    
      END;
    

    Şimdiki örnek ise bir tablodan bilgiyi alma,

    
      --kayıt türü tanımlanıyor
       TYPE per_kayit_turu IS RECORD (
         p_no    personel.personel_no%TYPE,
         p_adi   personel.adi%TYPE,
         p_ucret personel.ucret_no%TYPE);
    
      --kayıt tanımlanıyor..
      per_kayit per_kayit_turu;
    
      BEGIN
       -- tablodan okunan bilgilere atama yapılıyor...
        SELECT personel_no, adi, ucret
            INTO per_kayit.per_no, per_kayit.p_adi, per_kayit.p_ucret
          FROM personel WHERE personel_no = 101;
    
       --alanlardaki bilgiler görüntüleniyor
        DBMS_OUTPUT.PUTLINE(per_kayit.per_no);
        DBMS_OUTPUT.PUTLINE(per_kayit.p_adi);
        DBMS_OUTPUT.PUTLINE(per_kayit.p_ucret);
    
      END;
    

    Çıktı alamayan arkadaşlar blok yapısının üstüne ” SET SERVEROUTPUT ON; ” yazıp run etmeli…

    gökalp kuşçu

    Tags: , , , ,

    Reply

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

    *

    Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>