ROWTYPE kullanarak satır update etme ve kolonlarda DEFAULT anahtar kelimesi

ROWTYPE’ı  PL/SQL kodlarımızda sıkça kullanırız.Bununla, yapısı tablonun bir satırı şeklinde olan bir type tanımlamış oluruz.Kısaca hatırlatmak gerekirse; Örneğin TTT tablosu ID ve DESCR alanlarından oluşuyor ise

a_row TTT%rowtype;

tanımladıgımızda “a_row” artık TTT tablosunun satırı tipinde bir değişkendir.Bu satır değişkenini kolonlarına! ”a_row.ID” ve “a_row.DESCR” seklinde ulaşbiliriz.Şimdi asıl konumuza geçelim.

Bu tipte bir değişkenimiz varsa ve değerleri girmiş isek bir satırı update ederken her bir kolon için tek tek “set …, …, …” kullanmamıza gerek yoktur.”…set row = row_type ..” demeniz yeterlidir.Örnek yapalım :

create table ttest nologging as
select object_id, object_name, object_type from user_objects
where rownum <= 10;

Diyelimki minimum object_id verisinde UPDATE yapacağız.Hangisiymiş bulalım 

select min(object_id) from ttest;

min(object_id) 
3

declare
ttest_row ttest%rowtype;
begin
  ttest_row.object_id := 111;
  ttest_row.object_name := ‘XXX’;
  ttest_row.object_type := ‘???’;
  update ttest set row = ttest_row where object_id = 3;
  commit;
end;

Kontrol edelim :

select * from ttest where object_id = 111
object_id  object_name   object_type
111            XXX                 ???

Diğer bir konuda DEFUALT anahtar kelimesinin kolonlardaki kullanımına dair.Tabloda insert ya da update yaparken kolonun varsayılan değerini kullanmak isteyebilirz.Örnek olarak yukarıda oluşturduğumuz TTEST tablosunun “object_type” kolonuna varsayılan değer olarak ‘NEW_TYPE’ atayalım ve akabinde insert-update ile kullanalım :

SQL> alter table ttest modify object_type default ‘NEW_TYPE’;Table altered.

::: insert Örneği :::

SQL> insert into ttest values(999,’A_TABLE’, default);1 row created.SQL>
SQL> select * from ttest where object_id  = 999;
OBJECT_ID  OBJECT_NAME   OBJECT_TYPE
999               A_TABLE             NEW_TYPE

::: UPDATE örneği :::

SQL> update ttest set object_type = default where object_id = (select min(object_id) from ttest);1 row updated.SQL>
SQL> select * from ttest where object_id = (select min(object_id) from ttest);

OBJECT_ID   OBJECT_NAME   OBJECT_TYPE
15                 UNDO$                   NEW_TYPE

Indeks i kullandırabilmek için “şunu yapma bunu yap” türünden tavsiyeler ÖZET

Üzerinde indeks olan kolonlarda optimizer ın indeksi kullanabilmesi için temel bazı tavsiyeler

Bunlar YAPILMAMALI

1) … where first_name || last_name = ‘HAKKIOKTAY’
2) … where counter != 0;
3) … where trunc(process_date) = trunc(sysdate);
4) … where salary + 100 < 1000;
5) … where substr(last_name,1,3) = ‘OKT’

Yukarıdakilerin yerine şunlar tercih edilmeli

1) … where first_name = ‘HAKKI’ and last_name = ‘OKTAY’ ;
2) … where counter > 0 ;
3) … where process_date between trunc(sysdate) and trunc(sysdate) + .99999;
4) … where salary < 900;
5) … where last_name like ‘OKT%’;

Ayrica Indeksler hakkında  daha önceden yazdığım yazılara bakmanız faydalı olabilir.

i den j ye kadar olan kayıtların getirilmesi

En sık karşılaşılan isteklerden bir tanesi de okudugumuz kayıtlar arasında istenilen kadarını ya da belli kayıttan yine belli kayıtlar arasında olanları görmektir.Bunu sağlarken ROWNUM dan faydalanırız.Basit bir örnek yapalım.Bunun icin herkeste bulunan all_objects tablosundan 10 adet kayıt cekip TTEST tablosunu
oluşturalım :

create table ttest nologging as
select object_id, object_name from all_objects
where owner = ‘HR’
and    object_type = ‘TABLE’
and    rownum <= 10
order by object_id

Aşağıdaki sorgu ile 10 kayıtlık tablomuzdaki [1-5] arası kayıtları sonraki ile de [6-10] arası kayıtları getirebiliriz.

select * from
    (select TTABLE.*, rownum row_num from
      ( select /*+ FIRST_ROWS */ * from ttest ) TTABLE
    where rownum <= 5 )
where  row_num > 0

OBJECT_ID  OBJECT_NAME  ROW_NUM

12088            REGIONS           1
12090            COUNTRIES       2
12092            LOCATIONS       3
12095            DEPARTMENTS  4
12098           JOBS                 5

select * from
    (select TTABLE.*, rownum row_num from
      ( select /*+ FIRST_ROWS */ * from ttest ) TTABLE
    where rownum <= 10 )
where  row_num > 5 ;

OBJECT_ID   OBJECT_NAME  ROW_NUM
12100            EMPLOYEES         6
12104            JOB_HISTORY      7
13645            DEMO_IMAGES    8
13647            DEMO_USERS     9
13652            DEMO_CUSTOMERS 10