Parametre Modları
     Yukarıda fonksiyon ve prosedürler anlatılırken bunlara parametreler geçirilebileceği söylenmişti.Bir alt programa parametreler üç farklı modda geçirilebilir. Bunlar IN,OUT,IN OUT olarak adlandırılır.Bu üç mod her alt programda kullanılabilir.Fakat OUT ve IN OUT modlarının fonksiyonlarda kullanılmaması önerilir.Çünkü bir fonksiyonun amacı sıfır,bir ya da daha çok parametre alıp sonuçta tek bir değer göndermektir.
    IN modunda alt programa geçirilen bir parametre bir sabit gibi davranır.Yani alt program içerisinde bu parametrenin değeri alınıp başka bir değişkene aktarılabilir,fakat değiştirilemez.Eğer parametre geçirirken hiçbir mod belirtilmezse,parametreler otomatik olarak IN modunda kabul edilir.IN modunda gönderilen parametre bir sabit,string,değişken ve matematiksel bir işlem olabilir.
  
OUT modunda gönderilen bir parametre alt program içerisinde bir değişken gibi davranır. Paramterenin değeri alnıbilir ve değiştirilebilir. Bu tip bir parametre mutlaka bir değişken olmalıdır. Yani bir sabit ya da matematiksel bir işlem bu modda gönderilemez.Burada alt programa gönderilen parametrenin değeri, alt programa geçtiği anda NULL değer olur.Bu yüzden alt programa OUT modunda gönderilecek bir parametre tanımlanırken NOT NULL kısıtlamasının getirilmemiş olmasına dikkat edilmelidir.Alt program bittikten sonra,alt program içerisinde değer atanmış olan OUT modu parametreleri bu değerlerini korurlar.Yani girişte NULL değer alıp çıkışta değerlerini korurlar.
IN OUT modunda gönderilen parametreler diğer iki modun yaptığını birleştirirler.Yani bir parametre bir ilk değer ile alt programa girer,alt program içerisinde bu değeri değişebilir ve değerini kaybetmeden alt programdan çıkar. IN OUT modunda gönderilen bir parametre bir değişken olmalıdır,sabit,string ya da matematiksel bir işlem olamaz.

PL/SQL Paketleri       
   Oracle’da paket olarak adlandırılan nesneler,birbiriyle ilişkili fonksiyon ve prosedürlerin bir isim altında gruplanmasıyla oluşturulur.PL/SQL paketleri sayesinde daha modüler programlar geliştirilebilir.Birden fazla uygulama tarafından kullanılan bir paket üzerinde değişiklik yapılarak,tüm bu uygulamaların güncellenmesi sağlanabilir.Bir paket içerisindeki bir alt program çağrıldığında,tüm paket belleğe alınır ve bu paketle ilişkili diğer alt programlar bu sayede hızlı çalıştırılabilir.          
Bir paket tanımlama ve gövde kısımlarından oluşur.Tanımlama kısmı bir ara yüz gibidir.Veri tipleri,sabitleri hata durumları,imleçler ve alt programlar burada tanımlanır.Paket gövdesinde ise imleçlerin ve alt programların işlem satırları yer alır.Aşağıda Oracle yardım dokümanları içerisinde verilmiş bir şema yer almaktadır.Burada anlatılmak istenen "kara kutu" olarak verilen gövde kısmında rahatlıkla değişiklik yapılabileceğidir.Tanımlamalar "specification" kısmında yer aldığına göre gövdede yapılan değişikliklerden uygulama programı etkilenmeyecektir.

Bir paket oluşturmak için CREATE PACKAGE komutu kullanılır:
CREATE [OR REPLACE] PACKAGE paket_ismi
  [AUTHID {CURRENT_USER | DEFINER}] {IS | AS}
  [tip_tanımı [tip_tanımı] ...]
  [imleç_tanımı [imleç_tanımı] ...]
  [{altprog_tanımı | çağrı_tanımı}[{altprog_tan | çağrı_tan}]...]
END [paket_ismi];
[CREATE [OR REPLACE] PACKAGE BODY paket_ismi {IS | AS}  [tip_tanımı [tip_tanımı] ...]
 [imleç_gövdesi [imleç_gövdesi] ...]
  [{altprog_tanımı | çağrı_tanımı} [{altprog_tan | çağrı_tan}]...]
[BEGIN
 komut_cümleleri]
END [paket_ismi];]       
   Tanımlama kısmı genel tanımlamaları içerir ve uygulama programları tarafından görülür. Gövde kısmı ise program kodlarını,ayrıntıları ve özel tanımlamaları içerir.Uygulama programları buraya erişemez.Gövde de değişiklik yapıldığında uygulama programlarının yeniden derlenmesi gerekmez.
       Burada AUTHIDkısmı paketi oluşturan kullanıcın adıdır.  

CREATE OR REPLACE PACKAGE isci_islem AS  -- tanımlama
   TYPE IsKayTip IS RECORD (isci_no INTEGER,ucret REAL);
   CURSOR ucret_liste RETURN IsKayTip;
   PROCEDURE isci_kayit
(İscino NUMBER,isciadi VARCHAR2,isi VARCHAR2,
      muduru       NUMBER,ucret NUMBER,bolum   NUMBER);
PROCEDURE isci_sil (isci_no NUMBER);
END isci_islem;
CREATE OR REPLACE PACKAGE BODY isci_islem AS  -- gövde
   CURSOR ucret_liste RETURN IsKayTip IS
    SELECT iscino, ucret FROM isci ORDER BY ucret DESC;
   PROCEDURE isci_kayit ( iscino   NUMBER, isciadi  VARCHAR2,
     isi VARCHAR2,muduru  NUMBER,ucret  NUMBER,bolum NUMBER) IS
   BEGIN
  INSERT INTO isci VALUES (iscino, isciadi, isi,muduru,SYSDATE,ucret,bolum);   END isci_kayit;
   PROCEDURE isci_sil (isci_no NUMBER) IS
   BEGIN
      DELETE FROM isci WHERE iscino = isci_no;
END isci_sil;
END isci_islem;

PL/SQL Tetiklemeleri
Tetiklemeler(PL/SQL Triggers) tıpkı prosedürler gibi veritabanına kaydedilir,fakat program kodu içerisinde çağrılarak işletilmezler.Tetiklemeler veritabanı tarafından otomatik olarak başlatılırlar.Tetiklemeleri başlatan bazı olaylar vardır. Bu olaylar INSERT, UPDATE, DELETE gibi veri işleme dili komutları,veri tanımlama dili komutları,veri tabanı açma-kapama işlemleri,bir kullanıcnın bağlanma ya da bağlantı kesme işlemleri gibi olaylardır.Bir tetikleme prosedürü üç bölümden oluşur:

·   Tetikleme olayı ya da komutu
·   Tetikleme kısıtlaması
·   Tetikleme işlem bölümü

   Tetiklemelerin oluşturulmasını göstermek için bir örnek yapalım."isci" tablomuzdaki herhangi bir işçinin maaşı arttığında maaşı 1000’i geçenleri başka bir tabloya kaydeden bir tetikleme yazalım.Burada işleme maaş artıktan sonra başlayacağız.Bu yüzden AFTER UPDATE kullanıyoruz.Tetiklemelerin bu kısmına AFTER ve BEFORE gibi kelimeler yazılır. AFTER INSERT OR UPDATE gibi iki olayı kapsayan şartlarda yazılabilir.Buraya ON DATABASE SHUTDOWN gibi sistem olaylarıda yazılabilir.

 CREATE OR REPLACE TRIGGER maas_artisi AFTER UPDATE ON isci
   FOR EACH ROW WHEN (new.ucret > 1000)
BEGIN
    INSERT INTO isci_log (isci_no, artis_tarihi, yeni_ucret)
    VALUES (:new.iscino,SYSDATE,:new.ucret );
END;  

AYRINTILI BİLGİ İÇİN WEB SİTELERİ
Oracle Veri Tabanı Ayrıntıları ve Örnekler

Forms Builder ile Basit Bir Program

Oracle Veritabanı'nda Veri ve Sistem Güvenliği

YARARLANILAN KAYNAKLAR

· Şen, Osman Nihat. Oracle,SQL,SQL*Plus,PL/SQL ve Veritabanı Yönetimi,ikinci baskı (İstanbul:Beta Yayınları,2000)
· Şekihanov,Aydın.Oracle8i A Practical Guide To SQL,PL/SQL,Developer 6,(Ankara: AtılımUniversity Publications, 2001)
· Oracle8i Enterprise Edition Documentation
· Demirkol,Zafer.ASP ile Web Programcılığı ve Elektronik Ticaret,birinci baskı(İstanbul:Pusula Yayıncılık,2000)
· Öcal,Hakkı.ASP Bölüm 1,PC LIFE, Haziran 2000
· Öcal,Hakkı.ASP Bölüm 2,PC LIFE, Temmuz 2000

·  www.oracle.com
·  www.learnasp.com
·  www.aspturk.com
·  http://sirius.cs.ucdavis.edu

                                                         

 

Oracle Bölüm:4

PL/SQL
PL/SQL Bloklarının Yapısı

PL/SQL Akış Kontrolü

IF Kontrol Yapısı

LOOP Kontrol Yapısı

İmleçler

Hata Durumları

PL/SQL Prosedürlerİ

PL/SQL Fonksiyonları

Kayıtlı Alt Programlar

Parametre Modları

PL/SQL Paketlerİ

PL/SQL Tetiklemeleri

PL/SQL Oracle ürünleri başlıklı kısımda genel bilgi olarak anlattığımız PL/SQL’in burada ayrıntılarına ineceğiz.
PL/SQL Bloklarının Yapısı                 
      PL/SQL blok yapılı bir dildir.Her bir blok bir program ünitesini oluşturur.Pl/SQL blokları prosedür,fonksiyon ve normal blok olarak üçe ayrılır.Prosedür ve fonksiyon yapısı ileride ele ele alınmıştır.Şimdi burada normal bir blok yapısı işlenecektir.Bir PL/SQL bloğu seçimlik bir tanımlama bölümü, PL/SQL cümlelerinin yazıldığı bir bölüm ve hata yakalama bölümünden oluşur.Bloklara isim vermek zorunlu değildir.Eğer hazırlanan bir blok yeniden kullanılmak istiyorsa,sql uzantılı dosyalara saklanıp yeniden kullanılabilir.

* "[" ve "]" işaretleri arasındaki alanların yazılması zorunlu değildir.
 
[<blok  başlığı>]

[DECLARE
<sabitler>
<değişkenler>
<imleçler>
<kullanıcı tanımlı hata yakalama isimleri>]
BEGIN
<PL/SQL komutları>       
[ EXCEPTION<hata durumu komutları>]
END;
      Blok başlığı PL/SQL bloğunun prosedür,fonksiyon veya bir paket bloğu olup olmadığını belirler.Eğer bir başlık tanımlanmazsa bu isimsiz blok(anonymous) olarak adlandırılır. "Declare" kısmı diğer programlama dillerinde olduğu gibi değişken ve sabitlerin tanımlandığı kısımdır.
      PL/SQL blokları içerisinde kullanılan tüm sabitler,değişkenler,imleçler ve kullanıcı tanımlı hata durumları "declare" kısmında tanımlanmalıdır.Burada sabit ve değişkenler şöyle tanımlanabilir:          
       <değişken adı> [constant] <veri tipi> [not null] [:= <ilk değer>];
  SQL’de kullanılan tüm veri tipleri(SQL bölümünde anlatılmıştı) ve Boolean veri tipi burada kullanılabilir.Boolean tipte bir değişken "true","false" ve "null" değerlerini alabilir."not null" yan cümlesi değişkenin mutlaka bir değer alması gerektiğini bildirir.Burada tanımlanan değişkenlere ":=" operatörü ile ilk değer atanabilir.Eğer bir ilk değer atanmazsa değişkenlerin alacağı ilk değer "null" ‘dur. Eğer "constant" ile tanımlama yapılırsa değişkenin değeri değiştirilemez.
DECLARE
isbastar     date;
  /* ilk değeri "null" */
isi         varchar2(80) := 'tezgahtar';
isci_bulundu             boolean;
  /* ilk değeri "null" */
maas_artisi              constant number(3,2) := 1.5;
  /* sabit */
BEGIN ... END;

       Tanımlama kısmında değişkenlere bir veri tipi vermek yerine bir tablodaki bir alanın veri tipi değişkene aktarılabilir.Örneğin "isci.iscino%TYPE" şeklinde bir tanımlama ilgili değişkenin "isci" tablosundaki "iscino" değişkeni ile aynı veri tipinde olmasını sağlar.Tek bir değişken için tablonun bir alanının veri tipini almak yerine tablonun tüm alanlarının veri tipleri bir değişkene aktarılabilir.Örneğin "isci%ROWTYPE" ile istenen değişkene tablonun yapısı aynen aktarılabilir. Buna tıpkı Pascal’daki gibi "record" veri tipi denir. Burada eğer "tablo isci%ROWTYPE" şeklinde bir tanımlama yapılırsa tablo.iscino ya da tablo.isciadi şeklinde değişkenler kullanılabilir.Bu tür bir tanımlama imleç kullanırken kolaylık sağlar.  
   PL/SQL blokları içerisinde gerçekleştirilecek işlemler begin..end kelimeleri arasına yazılır. Burada dikkat edilmesi gereken bir husus vardır: PL/SQL blokları içerisinde veri tanımlama dili komutları(yani Create Table, Alter TableSpace, Drop User gibi) ve veri kontrol dili komutları(grant ve revoke gibi) kullanılamaz. Pl/SQL blokları içerisinde veri işleme dili komutları kullanılabilir.(Select, Update, Delete,Insert gibi).
     Hata durumları ya da aykırı durumlar olarak adlandırılan "exceptions" kısmında PL/SQL blokları arasında gerçekleşen bazı hataları kullanıcıya yansıtmadan kontrol etme ve gerekli işlemleri yapma olanağı vardır. Oracle tarafından tanımlanmış hata durumları olduğu gibi programcılar da hata durumları tanımlayabilirler.

PL/SQL Akış Kontrolü           
     Pl/SQL blokları içerisinde kosullu-koşulsuz dallanmalar ve döngüler kullanılabilir.Bu amaçla kullanılan yapıları burada inceleyeceğiz.PL/SQL’de iki tip kontrol yapısı vardır. Birincisi "IF " kontrol yapısı ve diğer "LOOP " kontrol yapısı.
IF Kontrol Yapısı       
   PL/SQL içerisinde üç tip "IF" yapısı kullanılır:

1-)IF şart THEN 
2-)IF şart THEN            
3-)IF şart THEN
Komutlar   
                                                                          
komutlar
  END IF                                  
ELSE                                                   
ELSE IF şart                 
Şartın gerçekleşmemesi                       
  halindeki  
  komutlar                    
  ENDIF
        LOOP Kontrol Yapısı
        PL/SQL içerisinde temel LOOP,FOR ve WHILE döngüleri vardır.  LOOP                                                            
Komut1
           .....      
 KomutN          
 GOTO etiket adı           
 EXIT [WHEN şart]
 END LOOP;

FOR sayac IN [REVERSE] başlangıç..bitiş
LOOP   
Komut1 ...         KomutN EXIT [WHEN şart]
END LOOP
WHILE şart LOOP           Komut1                        ...        KomutN END LOOP;

 İmleçler
    Birden fazla kaydın hafızaya getirilme işlemlerine imleç(cursor) açma denir. İmleç açma, özellikle veritabanındaki tablolardan kayıtların teker teker getirilmesinde faydalı olmaktadır.Kayıtlar teker teker getirilerek üzerinde işlemler yapılıp tekrar veritabanına kaydedilebilmektedir.Oracle,hafızada bu tip işlemleri yapabilmek için yer ayırmaktadır.
İki çeşit imleç vardır:
    Kapalı İmleçler(Implicit Cursors):
Yazılan her SELECT,INSERT,UPDATE ve DELETE komutları için veritabanı tarafından otomatik olarak açılan imleçlerdir.Yazılan her SQL için,SQL’in yazım kontrollerini yapmak ve SQL'i çalıştırmak için hafızadan bir yer ayrılır.Bu ayrılan yer için standart olarak tanımlanan imlece kapalı imleç denir.PL/SQL blokları arasında yazılan SQL komutları için, tanımlanan kapalı imlece ait özellikler geçerli olmaktadır.Yazılan her SQL için tanımlanan kapalı imleçlerin şu özellikleri kullanıma açıktır:

SQL%ISOPEN : SQL sonucu eğer imleç açık ise "true" değeri,kapalı ise "false" değeri döndürür.
SQL%ROWCOUNT :
SQL cümlesi tarafında işlem gören kayıt sayısnı görüntüler.
SQL%FOUND :
SQL sonucu en az bir kayıt işlem görmüşse "true",hiç kayıt işlem görmemişse "false" döndürür.
SQL%NOTFOUND : SQL sonucu eğer hiçbir kayıt işlem görmemişse "true",en az bir kayıt işlem görmüşse "false" değeri döndürür.

 DECLARE       
Silinen_kayit_sayisi       number(5);
BEGIN
  
delete from isci  where bolum=10;         silinen_kayit_sayisi:=SQL%ROWCOUNT;
END;
DECLARE         
delete from isci  where bolum=10;        
if SQL%FOUND then                  commit;          
else                                           rollback;         
END;

Açık İmleçler(Explicit Cursor):Kullanıcı tarafından belirli bir işi yapabilmek için açılan imleçlerdir. Özellikle fazla sayıda kayıtların bulunduğu tablolarda,silme,güncelleme ve benzer işlemlerde çok kullanışlı program parçalarıdır.
 
DECLARE
CURSOR <imleç adı> [(<parametre listesi>)] IS
                         SQL cümlesi
Kayıt_tipi_değişkeni       <imleç adı>%ROWTYPE
Değişken_1       NUMBER;
Değişken_2       NUMBER;
BEGIN  
OPEN <imleç adı>        
LOOP   
FETCH <imleç adı> INTO kayıt_tipdeğişkeni;
EXIT WHEN <imleç adı>%NOTFOUND;   
........   
komutlar;         
            END LOOP;       
CLOSE <imleç adı>;
END;    
Burada imleç adı PL/SQL blokları içerisinde başka bir değişken adı olarak kullanılıyor olmamalıdır.Parametreler "<parametre adı> <veri tipi>" şeklinde bildirilmelidir.PL/SQL içerisinde kullanılan tüm veri tipleri parametreler için kullanılabilir.(char,varchar2,number,date,boolean ya da number veri tipinin integer, real gibi alt veri tipleri).Aşağıda farklı şekillerde açılmış imleç örnekleri verilmiştir:

CURSOR c1 IS SELECT iscino, isciadi, isi, ucret FROM isci WHERE ucret > 2000; CURSOR c2 RETURN bolum%ROWTYPE IS  SELECT * FROM bolum WHERE bolumno = 10;
CURSOR c3 (verilen_tarih DATE) IS
SELECT iscino, ucret FROM isci WHERE isbastar > verilen_tarih;

      Eğer bir imleç açıldığında kayıtlar üzerinde değişiklik yapılacaksa,imleç tanımından sonra "for update[(<sütun(lar)>)]" şeklinde tanımlama yapılmalıdır. Böyle bir tanımlama yapıldığında imleç içerisindeki kayıtlar kilitlenir ve "commit" komutu uygulanana kadar diğer kullanıcılar bu kayıtlara erişemez.

Hata Durumları
      Hata durumları normalin haricindeki durumlarda nelerin yapılacağının tanımlandığı bölümdür.Belirtilen özel durum oluştuğunda Oracle, PL/SQL komutlarını çalıştırmaya devam etmemekte, onun yerine o özel durumda yapılması tanımlanan işlemleri yapmaya çalışmaktadır.Hata durumları iki türlüdür:Oracle tarafından önceden tanımlanmış hata durumları ve kullanıcı tanımlı hata durumları.

EXCEPTION                             
WHEN  <önceden tanımlanmış hata durumu> THEN Komutlar

Oracle tarafından tanımlı çok kullanılan hata durumları:

DUP_VAL_ON_INDEX Tekil olması gereken bir alana bu durumu ihlal eden bir kayıt eklenmeye çalışıldığında ortaya çıkar.

INVLAID_CURSOR

"OPEN"komutu ile açılmamış bir imleç ile işlem yapılmaya çalışıldığında ortaya çıkar.
INVALID_NUMBER Değişkenin tanımından daha büyük bir sayı değişkene atanmak istendiğinde ortaya çıkar.
NO_DATA_FOUND SQL sonucu kayıt dönmediği zaman ortaya çıkar.

ZERO_DIVIDE

Sıfıra bölme işleminde ortaya çıkan durumdur.

TOO_MANY_ROWS Bir kayıt dönmesi gereken SQL‘den birden fazla kayıt döndüğünde ortaya çıkan durumdur.
VALUE_ERROR Nümerik veya karakter tipli bir değişkenin diğerinin yerine kullanılmaya çalışıldığı durumdur.
CURSOR_ALREADY_OPEN Açık bir imlecin tekrar açılmaya çalışıldığı durumdur.
LOGIN_DENIED Veritabanına yanlı kullanıcı adı ve şifre ile bağlanılmaya çalışıldığı durumdur.
NOT_LOGGED_ON Veritabanına bağlanmadan SQL cümlesi çalıştırıldığında ortaya çıkan durumdur.
OTHERS EXCEPTION bölümünde yazılan hata durumlarından hiç biri oluşan hatayla eşleşmediğinde  bu durum işleme girer.

Kullanıcıların tanımladığı hata durumları da önceden tanımlı hata durumları ile benzerdir.Farklı olarak kullanıcı bir prosedür çağırıyormuş gibi bu hata durumlarını da çağırmalıdır.Çağırmak için "RAISE" komutu kullanılır.

 DECLARE        
......
 BEGIN 
             ......
      IF ucret<2000 THEN                 
RAISE dusuk_maas;
       END IF;           
......
       EXCEPTION                                        
WHEN dusuk_maas THEN                             
      Message(‘Düşük maaşlı işçi’);
END;

PL/SQL Prosedürleri
Prosedürler belirli işlemleri gerçekleştirmek üzere oluşturulan özel bloklardır. PL/SQL’de prosedürler diğer programlama dillerinden biraz farklı olarak birden fazla değer döndürebilirler.

 PROCEDURE isim [(parametre[, parametre, ...])] IS   [yerel tanımlamalar]
BEGIN  
             komutlar   
[EXCEPTION  hata durumları]
END [isim];
parametre_adı [IN | OUT [NOCOPY] | IN OUT [NOCOPY]] veritipi
   [{:= | DEFAULT} açıklama]

   Bir prosedürün iki kısmı vardır:Tanımlama ve gövde.Tanımlama kısmı PROCEDURE kelimesi ile başlar ve prosedür adı ya da parametre listesi ile biter. Parametre tanımlamaları zorunlu değildir.Parametre kullanılmayan prosedürler parantez kullanmadan yazılabilirler.
   Prosedürün gövde kısmı IS anahtar kelimesi ile başlar ve END anahtar kelimesi ile biter.Prosedürün gövdesi de üç kısma ayrılır:Değişkenlerin tanımlandığı kısım,komut cümlelerinin yazıldığı kısım ve hata durumlarının kontrol edildiği kısım.Değişken tanımlama kısmı IS kelimesinden hemen sonra başlar. Burada DECLARE kelimesi kullanılmaz.Komut cümlelerinin yazıldığı kısım ise BEGIN anahtar kelimesi ile başlar ve EXCEPTION ya da END ile biter. Bu kısımda en az bir komut yazılmalıdır.Hata durumları kısmı zorunlu değildir.Prosedür END kelimesi ile son bulur.Bu anahtar kelimenin yanına prosedür ismi yazılabilir, zorunlu değildir.           
Aşağıdaki maas_artır prosedürü bir işçinin maaşının verilen miktar kadar artırılmasını sağlar:

PROCEDURE maas_artır (isci_no INTEGER, miktar REAL) IS
   gecerli_ucret REAL;
   ucret_yok EXCEPTION;
BEGIN
   SELECT ucret INTO gecerli_ucret FROM isci
     WHERE iscino = isci_no;
   IF gecerli_ucret IS NULL THEN
      RAISE ucret_yok;
 ELSE
 UPDATE isci SET ucret = ucret + miktar
       WHERE iscino = isci_no;
  END IF;
EXCEPTION
   WHEN NO_DATA_FOUND THEN
    print 'Yanlış İşçi Numarası'
 WHEN ucret_yok THEN
      print 'Geçerli Maaş Miktarı Yok');
END maas_artır;           

Bu prosedür bir başka blok içerisinden şöyle çağırılabilir:

DECLARE  isci_no NUMBER;
   miktar REAL;
BEGIN
   ...
   maas_artır(isci_no, miktar); 

PL/SQL Fonksiyonları
Bir fonksiyon bir değer hesaplayan alt programdır. Fonksiyon ve prosedür yapıları RETURN anahtar kelimesi haricinde benzerdir. Fonksiyonlar şöyle yazılabilirler:

FUNCTION isim [(parametre[, parametre, ...])] RETURN veri_tipi
IS   [yerel tanımlamalar]
BEGIN
  Komut cümleleri
[EXCEPTION Hata durumları]
END [isim];

parametre_ismi [IN | OUT [NOCOPY] | IN OUT [NOCOPY]] veri_tipi
   [{:= | DEFAULT} açıklama]    
Yukarıda prosedürler için anlatılan yapı kısmı fonksiyonlar içinde geçerlidir. Fark olarak burada fonksiyon tek bir değer döndürür ve bu değerin tipi RETURN anahtar kelimesinde sonra yazılır.     
Aşağıdaki fonksiyon bir maaş miktarının istenen dereceye ait olup olmadığını bulur:         

FUNCTION maas_ok (maas REAL, ucret_derece INTEGER) RETURN BOOLEAN IS
   min_ucret REAL;
  max_ucret REAL;
BEGIN
   SELECT endusuc, enyukuc INTO min_ucret, max_ucret
   FROM ucretoran
      WHERE derece = ucret_derece;
   RETURN (maas >= min_ucret) AND (maas <= max_ucret);
END maas_ok;

 
                       Bu fonksiyon bir başka blok içerisinden şöyle çağrılabilir:

DECLARE 
yeni_ucret REAL;
yeni_derece NUMBER(5);
BEGIN  
...
   IF maas_ok(yeni_ucret, yeni_derece) THEN ... 

Kayıtlı Alt Programlar           
Bir PL/SQL alt programını Oracle’ın tüm diğer ürünlerinde de kullanmak istiyorsak bu alt programı veritabanına kaydedebiliriz.Alt programları Oracle veritabanına kalıcı olarak kaydetmek için CREATE PROCEDURE ve CREATE FUNCTION komutları kullanılır.