Pl/sql ile random değer üretmek DBMS_RANDOM

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

Bloga başlarken başlangıç seviyesinde bir konu yazmak istiyordum ama bugün (yazıyı bitirdiğimde fark ettim ki yeni bir güne çoktan başlamışız…) lazım olan ve kullandığım bir yapıyı bu saatte ( (: ) hazır blogu açmışken yazıyım istedim.

Oraclenin birbirinden güzel hayatı kolaylaştıran bir kaç yüz packagesinden biride DBMS_RANDOM packagesi. Sayı üretirken DBMS_RANDOM.RANDOM, DBMS_RANDOM.NORMAL ve DBMS_RANDOM.VALUE şeklinde, string üretirken DBMS_RANDOM.STRING şeklinde çağırımları var.

Genel anlamda packageye bakacak olursak;

Random bir sayı üretilmeden önce istersek packageyi explicit olarak initialize edebiliyoruz. Eğer biz initialize etmemişsek otomatik olarak DATE, USER ID, PROCESS ID değerleri ile implicit olarak initialize ediliyor.

Packegenin alt yordamlarına kısaca bakalım;

DBMS_RANDOM.INITIALIZE( IN_VAL IN BINARY_INTEGER) yukarıda bahsettiğim gibi bu yordamı çağırmak opsiyonel değer atamasını yapmasakta random değer elde edebiliyoruz.

DBMS_RANDOM.NORMAL Number tipinde bir değer döner.  Standard normal distribition bir number değer döner. Number bir değer üretmek istiyorsanız bunu kullanmanızı öneririm.

SQL> select dbms_random.normal from sys.dual;

NORMAL
———-
-2,0057985

SQL> select dbms_random.normal from sys.dual;

NORMAL
———-
-0,33526881

SQL> select dbms_random.normal from sys.dual;

NORMAL
———-
0,10441785

DBMS_RANDOM.RANDOM ile [ -2^31 , 2^31 ) kümesinden bir sayı üretilir.  (Artık obsolete durumda olduğu için kullanmamak gerek, eski versiyonlarda kullanılıyor sanırım).

SQL> select dbms_random.random from sys.dual;

RANDOM
———-
-632087812

DBMS_RANDOM.VALUE ile [0 , 1) kümesinden 38 precision’a sahip sayılar üretilmektedir. Overload bir versiyonuda bulunmaktadır. İstenirse DBMS_RANDOM.VALUE(x,y) şeklinde çağırılarak x <= Deger < y aralığında bir sayı elde edilebilir.

SQL> select dbms_random.value from sys.dual;

VALUE
———-
0,351522326

SQL> select dbms_random.value(2,4) from sys.dual;

DBMS_RANDOM.VALUE(2,4)
———————-
3,69025589

DBMS_RANDOM.STRING (IN_TYPE IN CHAR, IN_LEN IN NUMBER) Bu fonksiyon ile random stringler oluşturabiliyoruz. Güvenlik doğrulamaları, onay kodu vs. gibi işlemler için kolaylık sağlayacak bir fonksiyon. Kullanımı da oldukça basit, IN_TYPE değişkenine ne tür bir text elde etmek istediğimizi veriyoruz, IN_LEN değişkenine de kaç karakter istediğimizi veriyoruz sonuç;

SQL> select dbms_random.string(‘u’,10) from sys.dual;

DBMS_RANDOM.STRING(‘U’,10)
————————–
GYWYUGRGWB

SQL> select dbms_random.string(‘x’,10) from sys.dual;

DBMS_RANDOM.STRING(‘X’,10)
————————–
E9RHDQFF52

SQL> select dbms_random.string(‘a’,10) from sys.dual;

DBMS_RANDOM.STRING(‘A’,10)
————————–
PMyHxFGTpe

Kullanışlı bir function değil mi (:

IN_TYPE için kullanılabilecek değerler;

  • ‘u’ veya ‘U’ : Büyük harf alfa karakterler.
  • ‘l’ veya ‘L’ : Küçük harf alfa karakterler.
  • ‘a’ veya ‘A’ : Büyük küçük harf karışık alfa karakterler.
  • ‘x’ veya ‘X’ : Büyük harf alfa nümerik karakterler.
  • ‘p’ veya ‘P’ : Print edilebilecek herhangi bir karakter.

SQL> select dbms_random.string(‘p’,10) from sys.dual;

DBMS_RANDOM.STRING(‘P’,10)
————————–
C83^bl_?+,

IN_TYPE null yollanırsa büyük harf alfa karakterler geri dönüş karakter dizisini oluşturacaktır.

DBMS_RANDOM.TERMINATE package ile işimiz bittiğinde çağırıyoruz. (11g ile obsolete durumda olduğu için kullanımı tavsiye edilmiyor galiba eski versiyonlar için kullanılan bir özellik 10g R2 de de hiç bir işlem yapmıyor.)

Bir tablodan rasgele bir (veya daha fazla) kayıt çekmek için kullanabileceğimiz bir sorgu;

SELECT   *
FROM   (  SELECT   *
FROM   HR.EMPLOYEES
ORDER BY   DBMS_RANDOM.VALUE)
WHERE   ROWNUM < 2

ROWNUM değerini değiştirerek istediğimiz kadar kaydı tablodan rasgele çekebiliriz.

Packagenin özellikleri ve kullanımı kısaca bu şekilde umarım faydalı olur.

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page