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)
'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:
Yorum Gönder