6 Kasım 2010 Cumartesi

Tablodaki Herhangi Bir Alanı Random Bir Değerle Doldurmak


Bugün bir arkadaşıma, kullanmakta oldukları bir tablodaki number olan bir alanı birbirinden farklı değerlerle doldurmaları gibi bir gereksinimleri olmuş. Bende burdan yola çıkarak kapsamı biraz daha genişleterek number, string ve date alanları için birbirinden farklı olarak değerlerle bu alanları nasıl doldurabiliriz diye ufak bir çalışma yaptım.

Şimdi çalışmamız için örnek bir tablo oluşturalım.

create table deneme
(
  id     number,
  name   varchar2(10),
  sdate  date
) ;

Table created.

Şimdi bikaç tane örnek data oluşturalım.

insert into deneme values (1,'kamil',trunc(sysdate)) ;
insert into deneme values (2,'kamil',trunc(sysdate)) ;
insert into deneme values (3,'kamil',trunc(sysdate)) ;

commit ;

Aşağıdaki çalışmayı biz 180.000 kayıt üzerinde yaptık ama burda sadece örnek olması açısından 3 kayıt üzerinde yapıyorum.

select * from deneme ;

        ID NAME       SDATE   
---------- ---------- ---------
         1 kamil      05-KAS-10
         2 kamil      05-KAS-10
         3 kamil      05-KAS-10

3 rows selected.

Öncelikle number olan ıd alanındaki tüm değerleri random olarak farklı değerler olacak şekilde update edelim.

UPDATE deneme m
SET id =
(
SELECT s.val
FROM (
select val, id from
 (select rowid rd from deneme) a,  deneme b, (SELECT trunc(dbms_random.value(1,10000)) val FROM dual) c
where a.rd = b.rowid
and a.rd = m.rowid
 s
WHERE m.id = s.id
);

3 rows updated.

Select * from deneme;

        ID            NAME             SDATE   
----------            ----------            ---------
      2283         kamil               05-KAS-10
      5817         kamil               05-KAS-10
      8495         kamil               05-KAS-10

3 rows selected.


Scripteki  “dbms_random.value(1,10000)  “  ifadesinde (1,10000) ifadesi 1 ile 10000 değerleri arasında random bir kayıt döndür demektir. Siz tediğiniz aralığı belirtebilirsiniz.

Ikinci örneğimize geldik varchar olan string bir alanı random olarak dolduralım şimdide ;

UPDATE deneme m
SET (name) =
(
            select val from
            (select rowid rd from deneme) a, (SELECT dbms_random.string('X', 9)  val FROM dual) c
            where
            a.rd = m.rowid
);

3 rows updated.

Select * from deneme ;


        ID            NAME             SDATE   
----------            ----------            ---------
      2283         TZZV8RE2N  05-KAS-10
      5817         BEQ5BSIDH  05-KAS-10
      8495         2ECDB3U3Z  05-KAS-10

3 rows selected.
Burada da varchar2 type’ ındaki name alanını random değerlerle update etmiş olduk . Scripteki “dbms_random.string('X', 9)”   ifadesindeki 9 döndürülecek olan random kayıdın kaç karakterde olacağını ifade ediyor. X kolonu ise aşağıdaki parametrik değerlerden herhangi birini yazabilirsiniz. Örneğin P yazarsanız klavye üzerinde tanımlı olan tüm yazılabilir karakteri içeren random kayıtlar döndürür.

'a',       'A'        alpha characters only (mixed case)
'l',        
 'L'        lower case alpha characters only
'p',      
 'P'        any printable characters
'u',       
 'U'        upper case alpha characters only
'x',       
 'X'        any alpha-numeric characters (upper)

Son olarak date olan bir alanı nasıl random data ile dolduraibleceğimize bakalım. Bunun için öncelikle Julian date formatından faydanılıyoruz.

Aşağıdaki script ile hangi tarih aralığındaki kayıtları kullanmak istiyorsak onları belirliyoruz. Benim örnekde 01/01/2010 başlayıp bugüne kadarki olan tüm tarihleri kullanabilir diyorum. Başlangıç tarihim olan 01/01/2010 tarihini Julian formatında neye denk geldiğini hesaplıyorum öncelikle ;

SELECT TO_CHAR(TO_DATE('2010-01-01', 'YYYY-MM-DD'), 'J') FROM DUAL;

TO_CHAR(TO_DATE('2010-01-01','YYYY-MM-DD'),'J')
-----------------------------------------------
2455198                                       

1 row selected.

UPDATE deneme m
SET (sdate) =
(
select val from
 (select rowid rd from deneme) a, (SELECT TO_DATE(TRUNC(DBMS_RANDOM.VALUE((SELECT TO_CHAR(TO_DATE('2006-12-30', 'YYYY-MM-DD'), 'J') FROM DUAL),  (SELECT TO_CHAR(sysdate, 'J') FROM DUAL) )), 'J') VAL FROM DUAL) c
where a.rd = m.rowid
);

3 rows updated.

Scriptte ilk verdiğim tarih başlangıç, son vardiğim tarih bilgilsi olan sysdate ise bitiş aralığı gösteriyor.
        ID            NAME             SDATE   
----------            ----------            ---------
      2283         TZZV8RE2N 20-NIS-10
      5817         BEQ5BSIDH 07-TEM-10
      8495         2ECDB3U3Z 08-EKI-10

3 rows selected.

Scripte tarih formatını yukarıdaki verebileceğimiz gibi Julian formatında da verebiliriz.  O zaman scriptimiz aşağıdaki formatta olacaktır.

UPDATE deneme m
SET (sdate) =
(
            select val from
            (select rowid rd from deneme) a, (SELECT TO_DATE(TRUNC(DBMS_RANDOM.VALUE(2455198, 2455198+365)), 'J') val FROM DUAL)  c
            where
            a.rd = m.rowid
);

3 rows updated.

Datalarımız ise ;
        ID            NAME             SDATE   
----------            ----------            ---------
      2283         TZZV8RE2N  22-NIS-10
      5817         BEQ5BSIDH  26-TEM-10
      8495         2ECDB3U3Z  26-ŞUB-10

3 rows selected.

Istediğimiz tarih aralığında random olarak update etmiş olduk.

Hiç yorum yok: