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ımlamave 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.
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;
· Ş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