Kategoriler
ORACLE

Oracle Database 11g – SQL Temelleri I ||Manipulating Data

Diğer dersleri https://selimkaratas.com.tr/oracle-11g-r2-egitimi-ders-notlari adresinden bulabilirsiniz.

9. Manipulating Data

sql statements

INSERT Statement:

desc departments;

— tablomuz ile ilgili bilgiler elde ederiz. data tipleri ve boş geçilip geçilmeyeceği görülür.

desc departments

insert into departments values ( 280, 'IT', 100, 1500);
/* -- diğer tablolarda yer alan değişkenlerin durumu göz önünde bulundurularak değer ataması yapılmalıdır.

-- Aynı id'li değişken atayınca hata alırız. Department_id 270 girilirse hata verecektir çünkü bu değere sahiptir başka data vardır.

-- manager_id 1 girmek istersek böyle bir değer olmadığı için yine hata verecektir. */
insert into departments(location_id, department_id, department_name, manager_id)
values ( 1600, 290, 'IT2', 101);

/* değişkenlerin sıralamasının önemi yoktur. value'leri girerken sıraya dikkat edilmelidir. */
insert into departments values ( 300, 'IT3', null, null);

/* null geçilemeyecek alanları girip diğer kısımları null girebiliriz. */
insert into departments (department_id, department_name)
values (310, 'IT4');

/* yine değişkenlerin sıralamasına dikkat ederek dataları girikten sonra null geçilebilecek alanlara bir şey yazmadan geçebiliriz */
insert into departments values
(&id_giriniz, '&name_giriniz', &mid_giriniz, &lid_giriniz);

-- id= 320 | name=IT5 | manager_id=100 | lid=1500 girebiliriz.

5 şekilde de insert işlemi yapabiliriz. ekleme yaptıktan sonra 

select * from departments
where department_id > 270;

şeklinde sorgulama yaparak eklenen dataları görebiliriz.

select * from departments where department_id > 270;

Ancak sqlplus tarafına geçip sorgulama yaptığımızda daha sonradan eklediğimiz sonuçları göremiyoruz.

sqlplus

Oracle’de çalışııralan DML’ler o session’da kalır ve veritabanının tamamını etkilemesi için TSL komutlarından biri bekler.  DML’ler session’da kalıcıdır tüm veritabanında kalıcı olarak çalıştırılan komutlar değildir

TSL Komutları ise

COMMIT:  Bütün veritabanı işlemleri kayıt edilir.

ROLLBACK: Yapılan tüm işlemler geriye alınır.

SAVEPOINT: Konunun sonunda anlatılacaktır.

Commit dedikten sonra artık veritabanına işler ve sqlplus ile de görüntüleriz.

SQLplus’da exit yazarak çıkarsak COMMIT işlemini yapar. X’dan kapatırsak ROLLBACK yapar. SQLDeveloper’da commit ya da rollback demeden kapatırsak bizi uyarır eğer kayıt edip çıkarsak commit işlemi yapılmış olur.

DML’lerden sonra DDL’lerden  herhangi bir komut çalıştırılır ise oto commit yapar.

INSERT satır satır çalışır. Öyle bir insert yazayım ki 100 satıra kayıt yapsın diyemeyiz. 100 satır için 100 kere insert yazmamız gerekmektedir.  Programlama mantığında döngünün içerisinde yaparsak çalışabilir tabi ki. Ancak SQL’de olmaz.  Toplu insert için subquery kullanabiliriz.  Yani A tablosuna insert yapacağım bunun için B tablosundaki verileri kullan deriz.

Detaylarına henüz girmedik ama örneklerimiz için bir tablo yaratıyoruz. Aşağıdaki sorguyu kullanabilirsiniz.

create table sales_rep (id number (3), name varchar2(30), salary number(8), comm number(2.2));
desc sales_rep;
-- tabloya ait değişken ve değişken tiplerini görüyoruz

desc sales_rep

insert into sales_rep (id,name,salary,comm)
select employee_id, last_name, salary, commission_pct
from employees
where job_id = 'SA_REP';

-- subquery ile sales_rep tablosuna employee_id tablosundan 
-- job_id'si= 'SA_REP'; olanları toplu insert yapıyoruz.
-- Toplu insert de values yoktur. Bunun yerine subquery var.
select * from sales_rep;

select * from sales_rep

 

Update ve Delete işlemleri INSERT gibi geri dönüşümü kolay olan işlemler değildir. Dikkatli olmak gereklidir.  FLASHBACK teknolojisi ilerleyen aşamalarda anlatılacaktır. Oracle’in bu değişimler üzerinden geri dönüşü sağlayan bir teknolojisidir.

UPDATE:

select * from sales_rep;

select * from sales_rep

 

update sales_rep set salary = salary*1.1;
where id=150;

/* eğer where şartı yazılmazsa bütün kolona etki eder ve bu işlem sıkıntılar doğurabilir */

update işleminden sonra tablomuza tekrar bakarsak;

update sales_rep

gördüğümüz gibi id=150 olan çalışanın salary=11000 olmuştur.

update  olmadan önce 168

update sales_rep set salary = (select salary from sales_rep
 where id=168)
 , comm=(select comm from sales_rep
 where id=168)
where id=150;

burada yaptığımız işlem 150 id’li çalışanın salary ve comm bilgilerini id’si= 168 olan çalışana benzetmektir.  Çalıştırdıktan sonra

update sonrası 150

Gördüğümüz gibi update işleminden sonra 150 id’li çalışanın bilgileri 168 id’li çalışana benzemiştir.

Data’yı başka tablodan da alabiliriz.

update sales_rep set salary = (select salary from employees
 where employee_id=100)
 , comm=(select commission_pct from employees
 where employee_id=100)

DELETE

delete from sales_rep where salary >10000;

-- toplam'da 30 satır vardı. 
-- delete işleminden sonra ise 20 tane kalmıştır.

delete

 TRUNCATE: Kesinlikle yanlış kullanılmaması gereken komuttur. Geri dönüşü yoktur.

  • — DELETE ile aynıdır.
  • — where condition yazılamaz.
  • — DDL olduğundan geri alınamaz

Delete işlemi yapıldığından database o datayı tablodan siliyor ancak gidip başka bir yere gidip insert ediyor.  Sebebi ise rollback dediğimizde datayı getirmesi için bunu yapması gerekmektedir.

TRUNCATE TABLE sales_rep;

rollback

select * from sales_rep;

işlemlerini yapsak bile datalar geri gelmez.

dediğimizde tablo içindeki datalar silinir. Ve rollback işlemi yapılamaz.

SAVEPOINT: 

Ara durak noktalarıdır. Ve toplu silmeyip transaction hatalarını engellep amaçlı kullanabiliriz.

insert into departments values ( 280, 'IT', 100, 1500);
insert into departments(location_id, department_id, department_name, manager_id)
values ( 1600, 290, 'IT2', 101);
SAVEPOINT do_insert;
insert into departments values ( 300, 'IT3', null, null);
insert into departments (department_id, department_name)
values (310, 'IT4');
ROLLBACK TO do_insert;
select * from departments
where department_id > 270;

select * from departments where department_id > 270;

ROLLBACK işlemini yapmadan önce görünüm budur. Savepoint oluşturulmuştur. Şimdi savepoint noktasına rollback yapalım

ROLLBACK TO do_insert;

çalıştırdıktan sonra datalarımızın o kısma kadar olanı silinir.

ROLLBACK TO do_insert;

 

LOCKS-BEKLEME

  1.  x1. select x2. select çekerse  birbirlerini beklemez diyebiliriz.
  2.  x1. DML x2. select birbirlerini beklemez diyebiliriz.
  3. x1. DML x2. DML yapıyorlarsa;
  • — biri insert diğeri delete yapıyorsa bunlar birbirini beklemez
  • — ikisi de update yapıyorsa farklı kişileri yapıyorlarsa yine beklemez.
  • — ben a kişisini update ederken o da gelip update etmek isterse o zaman bekler.
  • — aynı satırlara müdahale etme ihtimali varsa bekler.

select * from employees for update;

— iki tarafta bu işlemi yaparsa biri bekler.
— where şartı yazılırsa karşı taraf o kısımla ilgilenmiyorsa beklemez. ( Ancak sorgu o satırı içeriyorsa bekler)

sqldeveloper tarafında sorgumuzun sonucunu aldık ancak sqlplus ile bu sorguyu yapmak istediğimizde bizi bekletiyor. select*from employees; yazarsak tabloyu görürüz ancak for update dersek bizi bekletecektir. Diğer taraf işlemini tamamlar tamamlamaz ( COMMIT dediğinde) dataları gösterecektir. Bu bekleme işlemine Locks denmektedir.

for update

 

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir