PLSQLe Giriş

PLSQLe Giriş

çıktısı

declare : Begin ile arasında değişkenlerin tanımlandığı alan.
into : SQL’den çekilen değer değişkene atanıyor.
dbms_output.put_line : Değişkenin değerini ekrana yazar. Alt satıra geçer. Sadece put olsa idi yanına devam eder. (put ların sonunda put_line gelmesi
gerekiyor aksi halde yazdırmıyor ?)
Bu prosedur ya da fonksiyon değil . Anonim bir bloktur, saklanmaz (scripti saklanmazsa) çöpe gitti. Fonksiyon olsa VT’ de saklanırdı. dbms_output.put_line debug gibi düşünülebilir kod düzgün çalışıyor mu , doğru değeri aldı mı gibi sürekli değişkenlerin değerini ekrana yazdırarak yanlışlığın nerde olduğu kontrol edilebilir. 5 birim ürünün bilgilerini getirmek için java 5 kere VT’ ye gider gelir. PLSQL’ de bir kerede yapılabilir. Bazı projelerdeki yavaşlıklarda kod java’da SQL’ e geçirilmesi gerekebiliyor. Hiç bir şey vt deki store prosedurden daha hızlı çalışamaz.
SGA – library cache daha önce çalışan SQL’ ler ve PLSQL’ leri derlenmiş olarak tutar tekrar çalıştırılmak istenirse library cache den getirir. Yeniden parse etmiyor. Parse işlemi uzun süren bir işlemdir. (tabloya yetki var mı, çağrılan kolonlar tabloda var mı, gibi kontroller yapar ) prosedurler herhangi bir programlama dilinden ya da SQL’ den çağrılabilir . Sorgu yapılabilen VT’ den prosedur de çalıştırılabilir.

PL/SQL Program Block
declare

begin (zorunlu)
program logic (zorunlu)
exception
end (zorunlu)

Tüm komutlar: ” ; ” ile bitirilir.
Örnek : Ekrana Merhaba yazdırır.

örnek : ekrana merhaba 1 den 5 e kadar yazdırır.

Burada declare ye gerek yokmuş. 1’den 1000 kadar döngü ile insert yapacak. loop la end loop alta da yazılabilir. Burada her insert den sonra commit etmiş.1000 taneyi insert ettikten sonra değil commit loop ın dışında değil burada rollback e çokta gerek yokmuş insert edilemezse o statement geri alınıyor
commit loop un dışında olsa idi rollbak işe yarardı.
Bu örnek exception için pek iyi bir örnek değil.
ppl/sql de atamalar := diye yapılır.

45 nolu department_id olmadığı için aşağıdaki hatayı verir

Hata mesajını yakalayabilmek için örneği aşağıdaki gibi değiştirelim.

Çıktı

PLSQL’ de DDL komutları direk yazılamaz, dml (insert update delete) ler yazılabilir. DDL (alter delete drop truncate ) komutları için dynamic sql e ihtiyaç vardır. “execute immediate ‘drop table members”; yazılabilir.

alter create drop gibi komutlar execute immediate yani dynamic sql ile çalıştırılabilir. Tablo adını dinamik almak için de dynamic sql kullanılır. Tablodan değer almak için dynamic SQL’ e gerek yoktur. Bütün tabloların kayıt sayılarını gösteren çıktı bu genel bir istek, bir milyondan fazla kaydı olan tablolar vb.
sqlplus da ” / ” en son çalıştırılan statement ı tekrar çalıştırır, ” run ” da aynı işi yapar ek olarak statement ı ekrana yazar.
. sytax ı buffer da tutup komut satırına düşürür / da çalıştırılır. (buffer da bir adet tutabilir.)

Hata yakalanırken kullanılan exceptionlarda ” WHEN others THEN ” en son yazılır. Çünkü genel hata , tanımlanmayan tüm hatalar buraya düşecek.

select te 3 deger varsa into da 3 deger olmalı, into atılacak deger tek satır olmalı. Örnekte iki kişi geliyorsa into ya atılamaz.

PLSQL’ de bunlara ek olarak boolean da tanımlanabiliyor. sql de tanımlanamıyor. İsimlendirme kuralları değişkenler için de geçerli.

Bunlar tablo , kolon ve pl sql de de değişken isimlerinde geçerli.

BEGIN
blolean değişkenler true or false değer alır.
toadda view —>toad options —> soldaki menuden editor seçilir
languages dan pl/sql seçilip
code templates tıklanır. Açılan pencerede istenildiği gibi kısatmalar (declare begin end >dbe gibi) girilir. code yazarken ctrl+space tuşu ile çağrılabilir.

— bunun çıktısı bayan oluyor, — false i true yaparsak erkek olur. boolean kolonda kullanılamaz

bu örnekte görüldüğü üzere fonksiyonları select user from dual; gibi sorgu çekmeden kullanabiliyoruz. Karşılaştırma Operatörleri

–sayilardan birini 10 dan küçük değer verirsek ekrana birşey yazmaz.

Bu tek sorgu ile de yapılabilir.

–bu sekilde satırlar alınmadan departments ın boş kopyası
–oluşturulur.
–where 1=1 olursa sağlanan bir şart olduğunda satırları ile birlikte oluşturulur.

–commit end den sonra da konulabilir. commit prosedürün içine mi konulacak dışına mı ? içine konulursa proseduru çalıştıran kişi aynı zamanda commit de etmiş olur.

Havale işleminde hesap no 24 ‘ten hesap no su 30 olan kişiye 50 TL gönderme işlemi

Hesaptan para çekildi, hesapnosu 30 olan kişiye aktarılırken bir hata oldu, diyelimki constraint var üst sınır var 100 tl. yatırılan para ile 110 olacak bu durumda para 30’un hesabına geçmez ve rollback olur transaction mantığı bu. çalşırsa ikisi birlikte çalışsın ,çalışmazsa ikisi de rollback olsun. Eğer birinci update ten sonra commit olsa idi para hesaptan düşer ama diğerine hesabına constraint ten dolayı yatırılamaz., bu durumda tutarsızlık olur 50 tl yok ortalıklarda.

Sürekli update cümlesi yazmak zor iş. Prosedur ile hesap no girelim artış miktarını girelim -50 dersek , 50 düşsün ,+50 dersek 50 eklesin. Burada yani ilk cümlede commit girilirse tutarsızlık olabilir. prosedurlerin içine commit in konulacağı yer duruma göre değişir.

commit konulmazsa değişiklik yapılan sessionda değişiklik gözükür. Diğer sessionlarda görünmez.

constraint eklemelerinde ” novalidate ” eski verilere bakma yenilere bak anlamındadır. constrainte uymayan eski verilere karışmaz.
default ” enablevalidate ” dir

create squence EmpIDsequence ;

tabloada primary olduğu için sürekli aynı sayıları insert edemez bu yüzden değeri sequence den alır.

Exit şartı konulması gereklidir yoksa sonsuza kadar devam eder. Exit koşulu ile çıkılabilir.
loop tehlikeli bir özelliktir . sonsuz döngüye girerse toad ı kapatmak gerekir.
Loop la 1 den 10 a kadar yazdıralım.

Bu halde çalıştırılırsa toad ı kapamak zorunda kalırız.

Sayı artırılması unutulursa da sonsuz döngüye girer. Unutmamak için “exit when sayi > 100; ” başa koymakta fayda var. Bu örneği for ile yapmak çok daha kolay.

Bitirilecek sayı bilindiğinde for kullanılıyor.

WHILE
Bitirilecek sayı bilinmediğinde kullanılır.

Not: Bu örnek çalışmadı.

CASE
Decode ile case arasındaki fark ; case tek başına kullanılabilir. Decode kullanılamaz.

Exception
Kullanıcılara ora- ile başlayan hatalar gösterilmez. Exception ile yakalıyıp kullanıcının anladığı bir hata mesajına döndürmek lazım. “Kişi bulunamadı vb”

Bu örnekte takımın değeri (value) tablo da yok ise “ORA-0143 no data found ” hatası alır. Kullanıcının hatayı bu şekilde almaması lazım. Her prosedur vb yapıda exception koymak gereklidir. Kullanıcı “ora-” lı hatalar görmemeli.

” others ” Tüm hata mesajlarını yakalayan operatordur. Genel birşeydir. Sadece hata oluştu dedirtebiliriz. Ne oldugu bilinemeyebilir.

“0” a bölünme oracle da bir hatadır divide by zero diye bir hata verir.

“hata oluştu” mesajı alınır.

“sıfıra bölünme ” hatası alınır.

Dept (department_id) mükerrer kayıt girip (department_id si 10 olan iki adet kayıt bulunmaktadır.

Bunun anlamı kimseye mesaj gösterme, exception koyma daha iyi Gerçekte hatanın olduğunu görmek için others iptal edilir.

“Beklenenden çok sonuç dönüyor” hatası alınır.

“SQLERRM” önemli bir özelliktir. En azından hatanın ne olduğunu yazar.

SQLERRM daha iyi Bir prosedur ile ORA-01422 hatası gelince türkçe bir mesaj getirtilebilir.

En azından böyle birşey yapılabilir.

Pragma Exception_INIT

Ön tanımlı hata olmadığı için pragma kullanılarak kendimiz tanımlarız. Pragma ile ön tanımlı olmayan hataları yakalayabiliriz.

Hata : Not null alanı geçemezsiniz!

Implicit Cursors

SQL%FOUND : Çalıştırılan SQL herhangi bir satırı değiştirdi ise örnekte bütün değerler 1000 den küçük olduğundan . SQL%FOUND FALSE oluyor. SQL%NOTFOUND ise TRUE oluyor. SQL%FOUND ve SQL%NOTFOUND birbirlerinin zıttı oluyorlar.
30’ dan büyükleri sil dediğimizde SQL%FOUND TRUE oluyor . SQL yapıldı gerçekleştirildi gibi bir değer.

User-Defind Events
Örneğin çalışanların ortalama maaşından düşük maaş olamaz diye bir tanımlama yaptık. Yeni giren kişiye maaş verilirken ortalama maaşa bakıp yüksek bir maaş verilecek. Düşük maaş verildiğinde oluşacak hatayı oracle yakalayamaz. iş mantığı ile oluşan hataları
geliştirici tanımlar. Örneğin bir günde 10’dan fazla kişi izinli omayacak. IK 11. kişiye izin vermek istediğinde program bunu
algılayacak ve hata verecek. Bu oracle ın yakalayabileceği bir hata değil.

Not: 20000 – 20999 arasındaki sayılar kullanıcılara ayrılmıştır.

Prosedurun ya da fonksiyonun içine bunun konulması istenmez. Çünkü hata kullanıcıya değil application server a gelir.