Yazdığınız PL/SQL procedure ve functionlarının, veritabanındaki tablolarda yapılan yapısal değişikliklerden daha az etkilenmesi için Oracle size iki özel veri tipi sunar: %ROWTYPE ve %TYPE. Varsayalım ki veritabanındaki bir tablodan iki alanı çekip bunları ekrana yazdırmanız gerekiyor ve biz bu alanların tiplerine göre bir procedure yazdık:
CREATE TABLE deneme (
id INTEGER,
isim VARCHAR2(40),
telefon VARCHAR2(10),
adres VARCHAR2(200));
CREATE OR REPLACE PROCEDURE telefon_listesi
IS
CURSOR liste IS SELECT isim, telefon FROM deneme;
tl_isim VARCHAR2(40);
tl_telefon VARCHAR2(10);
BEGIN
OPEN liste;
LOOP
FETCH liste INTO tl_isim, tl_telefon;
EXIT WHEN liste%NOTFOUND;
DBMS_OUTPUT.put_line ( ‘Isim ve Telefon: ‘ || tl_isim || ‘ (’ || tl_telefon || ‘)’ );
END LOOP;
END;
Yazdığımız procedure, tabloda yapısal bir değişiklik olmadığı sürece sorunsuz çalışacaktır. Ama tabloda yapısal bir değişiklik yapılırsa, örneğin telefon alanı, ülke kodlarını alacak şekilde 10 karakterden 13 karaktere çıkarsa, yazdığımız procedure tablodan 10′dan fazla karaktere sahip bir telefon bilgisi almaya çalıştığında hata verecektir. Bunu engellemek için procedure’ü şu şekilde yazabiliriz:
CREATE OR REPLACE PROCEDURE telefon_listesi
IS
CURSOR liste IS SELECT isim, telefon FROM deneme;
tl_isim deneme.isim%TYPE;
tl_telefon deneme.telefon%TYPE;
BEGIN
OPEN liste;
LOOP
FETCH liste INTO tl_isim, tl_telefon;
EXIT WHEN liste%NOTFOUND;
DBMS_OUTPUT.put_line ( ‘Isim ve Telefon: ‘ || tl_isim || ‘ (’ || tl_telefon || ‘)’ );
END LOOP;
END;
Görüldüğü üzere %TYPE kullanıldığında, PL/SQL bloğunda tanımlanan değişkenlerin tipleri direk olarak tablodan alınacaktır. Tabloda bir değişiklik yapıldığında bu değişkenlerin tipi de otomatik olarak değişecektir.
İstersek tabloda tanımlanan alanların tamamını %ROWTYPE ile alarak işlerimizi daha da kolaylaştırabiliriz:
CREATE OR REPLACE PROCEDURE telefon_listesi
IS
CURSOR liste IS SELECT isim, telefon FROM deneme;
kayit deneme%ROWTYPE;
BEGIN
FOR kayit IN liste
LOOP
DBMS_OUTPUT.put_line
( ‘Isim ve Telefon: ‘ || kayit.isim || ‘ (’ || kayit.telefon || ‘)’ );
END LOOP;
END;
%ROWTYPE, tablodaki kayıt yapısını göre bir RECORD verisi oluşturacaktır. Bu aynı zamanda, örnekte gösterildiği gibi CURSOR FOR LOOP tanımlaması kullanmamıza da olanak verecektir.