4 Nisan 2013 Perşembe

Tablodaki Herhangi Bir Alanı Random Bir Değerle Doldurmak

Kullanmakta oldugumuz  tablolarda  number olan bir alanı birbirinden farklı değerlerle doldurmak gibi bazı gereksinimlerimiz olusabiliyor cogu zaman.. 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,erdem,trunc(sysdate)) ;
insert into deneme values (2,erdem,trunc(sysdate)) ;
insert into deneme values (3,erdem,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              erdem   05-KAS-10
2              erdem   05-KAS-10
3              erdem   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        erdem 05-KAS-10
5817        erdem 05-KAS-10
8495        erdem 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 bilgisi 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:

Yorum Gönder