1/*
2------------------------------------------------------------------------------
3URL:       http://www.orafaq.com/scripts/plsql/random.txt
4Filename:  random.txt
5Purpose:   Random number/ string generator package
6Author:    Unknown
7Original:  http://www.orafaq.org/scripts/sql/random.txt
8Edits:
9 19990908 Phil Rand <prand@spu.edu> Added functions rand_string(), smaller().
10------------------------------------------------------------------------------
11*/
12
13create or replace package random
14is
15   procedure srand(new_seed in number);
16   procedure get_rand(r OUT number);
17   procedure get_rand_max(r OUT number, n IN number);
18   function  rand return number;
19   function  rand_max(n IN number) return number;
20   function  rand_string(ssiz IN number) return varchar2;
21   function  smaller(x IN number, y IN number) return number;
22   pragma restrict_references(rand, WNDS);
23   pragma restrict_references(rand_max, WNDS);
24   pragma restrict_references(random, WNDS, RNPS);
25   pragma restrict_references(rand_string, WNDS);
26   pragma restrict_references(smaller, WNDS);
27end random;
28/
29
30create or replace package body random
31is
32   multiplier   constant number := 22695477;
33   increment    constant number := 1;
34   "2^32"       constant number := 2 ** 32;
35   "2^16"       constant number := 2 ** 16;
36   "0x7fff"     constant number := 32767;
37   Seed         number          := 1;
38
39   function  smaller(x IN number, y IN number) return number is
40   begin
41	if x <= y then
42	    return x;
43	else
44	    return y;
45	end if;
46   end smaller;
47
48   function rand_string(ssiz IN number) return varchar2 is
49     i      number;
50     m      number;
51     c      char;
52     result varchar2(2000) := '';
53   begin
54	m := smaller(ssiz,2000);
55	for i in 1..m loop
56	    c := substr('abcdefghijklmnopqrstuvwxyz0123456789',rand_max(36),1);
57	    result := result || c;
58        end loop;
59	return result;
60   end rand_string;
61
62   procedure srand(new_seed in number) is
63   begin
64     Seed := new_seed;
65   end srand;
66
67   function rand return number is
68   begin
69     Seed := mod(multiplier * Seed + increment, "2^32");
70     return bitand(Seed/"2^16", "0x7fff");
71   end rand;
72
73   procedure get_rand(r OUT number) is
74   begin
75     r := rand;
76   end get_rand;
77
78   function rand_max(n IN number) return number is
79   begin
80     return mod(rand, n) + 1;
81   end rand_max;
82
83   procedure get_rand_max(r OUT number, n IN number) is
84   begin
85     r := rand_max(n);
86   end get_rand_max;
87
88begin
89   select userenv('SESSIONID')
90   into   Seed
91   from   dual;
92end random;
93/
94
95-- Some examples:
96select random.rand_max(10) from dual;
97select random.rand_max(10) from dual;
98select random.rand_string(20) from dual;
99select random.rand_string(20) from dual;
100
101