Генериране на случайни числа и стринг-ове в Oracle със SQL и DBMS_RANDOM

Знаете ли как да генерирате случайни числа и стринг-ове в Oracle, като използвате само SQL? Генерирането на случайни числа и стрингове в базите данни са необходими обикновенно, когато трябва да генерираме големи обеми от данни за тестове на базите данни и SQL скриптове за работа с базите данни или пък просто да генерираме случайна парола за новия ни потребител в сайта.

Каквато и да е нуждата за генериране на случайни числа и стринг-ове, Oracle базата данни ни предлага мощен метод за генериране на случайни числа или стрингове. Тази опция е по-бърза от всеки един PL/SQL който ще напишете сами, защото използва вградената логика на Oracle.

Пакета DBMS_RANDOM

Пакета DBMS_RANDOM ще генерира символи, цифри или букви и цифри на случаен принцип. Броя и границите на генериране на случаен принцип също могат да бъдат настройвани. Пакета DBMS_RANDOM е създаден от скрипта dbmsrand.sql достъпен в /rdbms/admin директорията.

Следващите функции на пакета DBMS_RANDOM могат да бъдат използвани за генерирането на информация по желание:

DBMS_RANDOM.RANDOM – генерира случайни числа.

DBMS_RANDOM.VALUE – генерира случайни числа от границата. Ако не бъде зададена граница, се взема по подразбиране от 0 до 1.

DBMS_RANDOM.STRING – генерира стрингове, а чрез сапътстващ параметър:
U – само главни символи
L – само малки символи
A – буквено-цифров код
X – буквено-цифров код с главни букви.
P – Само принтаеми символи.
Като втори параметър се подава дължината на генерираните символи.

В документацията на Oracle е записано, че е необходимо да се инициализира пакета DBMS_RANDOM, преди да се използва като случаен генератор. В същото време обаче, Oracle по подразбиране инициализира пакета DBMS_RANDOM, със seed юзъра който изпълнява процедурата, точното време и моментния session id.

DBMS_RANDOM.INITIALIZE – инициализира пакета DBMS_RANDOM.

DBMS_RANDOM.SEED – използва се за промяна на seed стойността. Seed-a се използва във вътрешния на Oracle алгоритъм за генериране на произволните стойности. По подразбиране seed-a е юзъра който изпълнява процедурата, точното време и моментния session id. Това означава, че всеки път когато използваме DBMS_RANDOM ще получаваме различни стойности. Ако преди изпълнението на SQL-а зададем определен seed, ще се генерират едни и същи стойности.

DBMS_RANDOM.TERMINATE – Спира процедурата по генериране на случайни символи.

Примери

Ето и малко примери:

Генериране на случайни цифри:
SQL> select dbms_random.random from dual;

Генериране на случайна цифра в граница от 0 до 1:
SQL> select dbms_random.value from dual;

Генериране на случайна цифра в граница от 1 до 1000:
SQL> select dbms_random.value(1,1000) num from dual;

Генериране на цифра с дължина 12 символа
SQL> select dbms_random.value(100000000000, 999999999999) num from dual;

Генериране на 20 символен буквен стринг, всички символи са с главни букви:
SQL> select dbms_random.string('U', 20) str from dual;

Генериране на 20 символен буквен стринг, всички символи са с малки букви:
SQL> select dbms_random.string('L', 20) str from dual;

Генериране на 20 символен буквено-цифрен стринг, всички символи са с малки букви:
SQL> select dbms_random.string('A', 20) str from dual;

Генериране на 20 символен буквено-цифрен стринг, всички символи са с големи букви:
SQL> select dbms_random.string('X', 20) str from dual;

Генериране на 20 символен принтируем стринг. Ще бъдат генерирани на случаен принцип всички символи, които могат да бъдат принтирани:
SQL> select dbms_random.string('P', 20) str from dual;

Заключение

DBMS_RANDOM е добър инструмент за генерирането на случайни символи. За съжаление обаче, пакета не е добре документиран, именно и за това написах настоящия пост 🙂
Надявам се, да съм Ви бил полезен!

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz