Veritabanına yeni veri ekleme,var olan verileri  güncelleme veya silme işlemleri DML(Data Manipulation Language-Veri İşleme Dili) kullanılarak yapılmaktadır.

DML cümlelerini kullanarak veriler üzerinde değişiklik yaptıktan sonra bu değişikliklerin kalıcı olması için COMMIT komutu çalıştırılmalıdır.COMMIT komutunun çalıştırılması ile o ana kadar yapılan değişikliklerin hepsi veritabanına işlenir ve kalıcı hale gelir.Yapılan değişiklikleri geri almak için ise ROLLBACK komutu kullanılır.

Oracle tarafından desteklenen DML ifadeler ;

    1. INSERT : Tabloya yeni kayıt ekler.
    2. UPDATE : Tabloda ki kaydı güncelleştirir.
    3. DELETE : Tabloda ki kaydı siler.
    4. MERGE : Tabloya kayıt ekler ya da değiştirir.
    5. LOCK TABLE : Diger oturumların tablo üzerinde DML işlem yapmasını engeller.
    6. SELECT FOR UPDATE : Başka oturumların seçilen kayıtlar üzerinde DML işlem yapmasını engeller.

INSERT

Bir veya daha fazla tabloya kayıt eklemek için INSERT cümlesi kullanılır.Eklenecek kayıt ya da kayıtlar doğrudan eklenebilicegi gibi ,bir alt sorgu tarafından alınarak da tabloya kayıt eklenebilir.Söz dizimi ;

INSERT INTO  tablo [ ( sütun1 , [ sütun2  ,sütun3 , ….. ] ) ]  VALUES  ( deger1, [ deger2 , deger3 , ..…]  );

  • Aşagıda ki SQL cümlesiyle departments tablosunun bütün sütunlarına VALUES kısmında ki verileri ekliyoruz.
INSERT INTO departments
(department_id,department_name,manager_id,location_id)
VALUES (300,'Oracle DBA',200,3200);

Insert cümlesi yazarken tablonun bütün sütunlarına veri eklemek zorunda degiliz,istedigimiz sütunlara veri ekler istemediklerimizi ise boş bırakabiliriz ancak sütunda  Not Null ya da Primary Key kısıtlayısı(constraint) varsa o sütuna veri girişi yapmak zorundayız.

  • Aşagıda ki SQL cümlesiyle departments tablosunun istedigimiz sütunlarına VALUES kısmında ki verileri ekliyoruz.
INSERT INTO departments
(department_id,department_name) VALUES (400,'Oracle Developer');

INSERT cümlesi yazarken sütun isimleri yazmak zorunda degiliz.Ancak bu durumda tabloda bulunan tüm sütunlara sırası ile veri girilecegi varsayılır.Sütunların sıralaması ise tablo oluşturulurken verilen sıradır,bu sıralamayı görmek için DESC komutunu çalıştırmamız yeterlidir.

  • Aşagıda ki SQL cümlesiyle departments tablosunun sütun sıralarını ve tablo ile ilgili bilgilere ulaşırız.
DESC departments;
Name Null Type
DEPARTMENT_ID NOT NULL NUMBER(4)
DEPARTMENT_NAME NOT NULL VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)
  • Aşagıda ki SQL cümlesiyle departments tablosunun bütün sütunlarına VALUES kısmında ki verileri ekliyoruz.
INSERT INTO departments VALUES (500,'Java Devoloper',200,3200);

INSERT cümlesi yazarken bazı durumlar da tabloya eklenecek kayıtlar başka bir SELECT cümlesinin sonucu olabilir.SELECT cümlesinden dönen her bir kayıt sırasıyla tabloya eklenir.Ama bu işlemin geçerli olması için SELECT cümlesinden dönen degerler ile verilerin eklenecegi tablonun sütun sayısı,sütun sıralaması ve sütunların veri tiplerinin uyumlu olması gerekir.

  • Örnek olması için departments_copy adında departments tablosunun sütunlarıyla uyumlu bir tablo oluştururuz.
CREATE TABLE departments_copy
(department_id number,department_name varchar2(250),
manager_id number,location_id number);
  • Aşagıda ki SQL cümlesi ile departments tablosunda ki bütün verileri departments_copy adlı tabloya kopyalıyoruz.
INSERT INTO departments_copy  SELECT * FROM departments;
  • Aşagıda ki SQL cümlesi ile departments tablosunda ki bütün verileri departments_copy adlı tabloya kopyalıyoruz ama bu sefer departments_copy tablosunun sütun sırasını biz belirtiyoruz.
INSERT INTO departments_copy
(department_id,department_name,manager_id,location_id)
SELECT * FROM departments;
  • Aşagıda ki SQL cümlesi ile departments tablosunda ki bütün verileri departments_copy adlı tabloya kopyalıyoruz ama bu sefer departments ve departments_copy tablosunun sütun sırasını biz belirtiyoruz.
INSERT INTO departments_copy
(department_id,department_name,manager_id,location_id)
SELECT department_id,department_name,manager_id,location_id FROM departments;

NOT : Tablolara INSERT cümlesi ile veri eklediğimiz gibi view(görüntü) aracılığı ile de tabloya kayıt ekleyebiliriz.

NOT : Oracle 9i’den itibaren INSERT cümlesi ile aynı anda birden fazla tabloya kayıt ekeleyebiliriz.

UPDATE

Tablolar da yer alan kayıtları güncellemek için UPDATE cümleleri kullanılır.Söz dizimi ;

UPDATE  tablo SET [sütun1=deger1, sütun2=deger2,….] [WHERE koşullar]

  • Örnegin aşagıda ki SQL sorgusuyla employees tablosunda ki salary sütununda ki bütün verileri yüzde on artırdı.
UPDATE employees SET salary=salary*110/100;
  • Aşagıda ki SQL sorgusuyla employees tablosunda first_name sütunu Alexander olan verilerin salary sütunundaki verileri yüzde on artırdı.
UPDATE employees SET salary=salary*110/100 WHERE first_name like 'Alexander';
  • Örnek 1;
UPDATE employees SET salary=salary*110/100 WHERE salary > 5000;
  • Örnek 2;
UPDATE employees SET hire_date='01.01.1990' WHERE hire_date < '01.01.1990';

DELETE

Tablolarda ki kayıtları silmek için DELETE cümleleri kullanılır.Söz dizimi ;

DELETE [FROM]  tablo [WHERE koşullar]

Bu sözdiziminde FROM kelimesi ve WHERE koşul cümlesi opsiyoneldir.Eger hiç bir WHERE koşulu kullanılmaz ise tabloda ki tüm kayıtlar silinir.Koşul belirtilirse de koşula uyan kayıtlar silinir.

  • Aşagıdaki örnekte departments_copy tablosunda ki bürün verileri siler .
DELETE FROM departments_copy ;
  • Aşagıdaki örnekte departments_copy tablosunda ki bürün verileri siler yani FROM yazsak da yazmasak da önemli degildir.
DELETE departments_copy ;
  • Aşagıdaki örnekte departments_copy tablosunda ki department_id sütununda verilerden 10 ve 20 olan kayıtları siler.
DELETE FROM departments_copy WHERE department_id IN (10,20);
  • Aşagıdaki örnekte departments_copy tablosunda ki department_name sütununda verilerden Oracle DBA olanları siler.
DELETE FROM departments_copy WHERE department_name='Oracle DBA';

MERGE

MERGE komutu ile girdigimiz kayıt tabloda var ise güncelleştirir yok ise tabloya kayıtı ekler.Söz dizimi ;

MERGE INTO tablo tablo_kısaadı
USING (table|view|subquery) kısaad
ON (birleştirme koşulu)
WHEN MATCHED THEN
UPDATE SET
sütun1=deger1,
sütun2=deger2
WHEN NOT MATCHED THEN
INSERT (sütun listesi)
VALUES(sütun degerleri);

  • INTO : Kaydın ekleencegi ya da güncellenecegi tabloyu belirtir.
  • USING : Eklenecek ya da güncellenecek kayıtların bulundugu kaynagı belirtir.
  • ON : MERGE işleminin güncelleme ya da kayıt ekleme işlemini nasıl yapacagı koşulu belirtilir.
  • WHEN MATCHED : Kaydın ilgili MERGE koduna uyması durumunda yapılacak işlemi belirtir.
  • WHEN NOT MATCHED : Kaydın ilgili MERGE koduna uymaması durumunda yapılacak işlemi belirtir.
  • Aşagıda ki örnekte ilk satırla departments_copy tablosuna dc takma adını veriyor,ikinci satırla verilerin çekilecegi kaynagı belirtiyor ve takma d takma adı veriyor,üçüncü satır ile koşulu belirtiyor,4-6 satırlar arası kaydın ilgili MERGE koduna uyması durumunda yapılacak işlemi belirtiyor,7-9 satırlar arası kaydın ilgili MERGE koduna uymaması durumunda yapılacak işlemi belirtir.
MERGE INTO departments_copy dc
USING ( SELECT department_id,department_name,manager_id,location_id FROM departments ) d
ON (dc.department_id=d.department_id)
WHEN MATCHED THEN
UPDATE SET
dc.department_name=d.department_name
WHEN NOT MATCHED THEN
INSERT (dc.department_id,dc.department_name,dc.manager_id,dc.location_id)
VALUES(d.department_id,d.department_name,d.manager_id,d.location_id);

LOCK TABLE

LOCK TABLE cümlesi başka kullanıcıların tablonun tamamı üzerinde bir kısım ya da tüm DML cümlelerinin çalışmasını engeller.Söz dizimi ;

LOCK TABLE tablo IN  [ SHARE | EXCLUSIVE ]  MODE  [ NOWAIT ]

Kilitleme işlemi yapılırken SHARE ya da EXCLUSIVE kilitleme şekillerinden biri kullanılır.SHARE kullanıldıgı zaman başka oturumların tablo üzerinde EXCLUSIVE ve kilit koymasını engeller ama SHARE koymasını engellemez.EXCLUSIVE kullanıldıgı zaman digger oturumların SHARE ya da EXCLUSIVE kilit koyması engellenir.Tablo üzerinde kilidin kalkması için tabloya kilit koyan oturum COMMIT ya da ROLLBACK çalıştırmalıdır.

    1. EXCLUSIVE: Bu opsiyon tüm tabloyu locklar ve tablonun herhangi bir row u dahi update edilmez lock ‘ın sona erdirilmesi gerekmektedir.(sadece okumaya izin verir)
    2. ROW SHARE:Tablo ya çoklu erişimlere izin verir ancak tablonun tamamının locklanmasına izin vermez.(okumaya ve dml işlemlerine izin verir)
    3. ROW EXCLUSIVE:Row share ile aynı özelliklere sahip olması ile birlikte share modda lock yapılmasını engeller.Oracle Default lock mekanizmasıdır.DML işlemlerinde oracle row-level lock için bu metodu kullanır.
    4. SHARE: Tabloya çoklu erişime izin verir ancak tablo üzerinde herhangi bir DML işlem çalışmasına izin vermez. İnex oluştururken bu metod kullanılır.(sadece okumya izi verir)
    5. SHARE ROW EXLUSIVE:Tablonun tamamının okunmasında sakınca yoktur ancak başka userlar tarafından tablonun locklanmasını engeller ve dml işlemlerinede izin vermez.
    6. Bu komutlarla birlikte NOWAIT parametreside kullanılırsa eğer bu tabloları locklamak isteyen bir user olursa onları bekletmek yerine hata dönerek kontrolun userlarda olmasını sağlayacaktır.
  • Aşagıda ki örnekle employees tablosunu kilitledik ve biz COMMIT veya ROLLBACK yapana kadar bizden başka kimse işlem yapamayacak.
LOCK TABLE HR.EMPLOYEES IN EXCLUSIVE MODE;
  • Lock’lu tabloları görmek için aşağıda ki scripti çalıştırırız.
SELECT   s.inst_id,
l.SID,
s.serial#,
l.TYPE,
d.object_name,
s.username blocking_session,
s.osuser,
l.LMODE
FROM   gv$lock l, dba_objects d, gv$session s
WHERE       d.object_id = l.id1
AND s.SID = l.SID
AND s.inst_id = l.inst_id
ORDER BY   inst_id;

SELECT FOR UPDATE

SELECT FOR UPDATE cümlesinin basit SELECT cümlesinden farkı bu SQL ile seçilen kayıtların başka kullanıcıların bu kayıtlar üzerinde işlem yapmasını engellemek amacıyla kilitlemesidir.Bu şekilde kilitlenen veriler SELECT sorguları ile erişilebilir ama silinemez ya da güncellenemez.SELECT FOR UPDATE ile kilitlenen kayıtlar üzerinde ki kilit bir COMMIT ya da ROLLBACK komutunun çalıştırılması ile sona erer.

NOT  : Örneklerimde Oracleda ki DUAL table ’ ı ve HR user ’ ı kullanıyorum.
Yararlı olması Dilegiyle…
Yazar : Mustafa Bektaş Tepe
Java && Oracle

Loading