Для генерации сочетаний символов для использования в качестве паролей может быть использована следующая процедура:
CREATE TABLE GENERAL
(
PASS VARCHAR2(30)
)
tablespace USERS
pctfree 0
pctused 99
initrans 1
maxtrans 255
storage
(
initial 24K
next 1040K
minextents 1
maxextents unlimited
pctincrease 0
);
/
CREATE OR REPLACE PROCEDURE "MAKER_DICT"
(na number, -- количество знаков в пароле
p_start_t number default 1, -- начальное значение для генерации
p_stop_t number default 2400000000 -- конечное значение для генерации
)
is
--********************************************************
-- генерация значений пароля до 7 знаков включительно
-- автор safeguardian@yandex.ru
--********************************************************
g_letters varchar2(26) := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
g_numbers varchar2(14) := '0123456789#$_@';
ma number := 0;
pw1 varchar2(7) := '';
pw2 varchar2(7) := '';
pw3 varchar2(7) := '';
pw4 varchar2(7) := '';
pw5 varchar2(7) := '';
pw6 varchar2(7) := '';
pw7 varchar2(7) := '';
res number :=0;
err number :=0;
cnt number :=0;
end_make number :=0;
start_t number := p_start_t;
stop_t number := p_stop_t;
FUNCTION fix_pass
(siz IN number) return varchar2
as
begin
return substr(g_letters||g_numbers,siz,1);
end fix_pass;
PROCEDURE comm
(ins varchar2)
is
BEGIN
if start_t >= p_start_t and start_t <= stop_t then
begin
start_t := start_t + 1;
cnt := cnt + 1;
insert /*+ append*/ into general values (ins);
if cnt = 100000 then
commit;
cnt := 0;
end if;
res:=res+1;
exception
when others then
commit;
err:= err + 1;
cnt := 0;
end;
end if;
END COMM;
begin
if p_start_t > p_stop_t or
p_stop_t > 2400000000 or
p_start_t < 1 or
p_stop_t < 1
then
dbms_output.put_line('Неверный диапазон значений');
return;
end if;
end_make := length(g_letters||g_numbers);
ma := round(na);
if ma > 7 then ma := 7; end if;
if ma < 1 then ma := 1; end if;
for a in 1..end_make loop -- 1
pw1 := fix_pass(a);
if ma > 1 then for b in 1..end_make loop --2
pw2 := pw1||fix_pass(b);
if ma > 2 then for c in 1..end_make loop --3
pw3 := pw2||fix_pass(c);
if ma > 3 then for d in 1..end_make loop --4
pw4 := pw3||fix_pass(d);
if ma > 4 then for e in 1..end_make loop -- 5
pw5 := pw4||fix_pass(e);
if ma > 5 then for f in 1..end_make loop --6
pw6 := pw5||fix_pass(f);
if ma > 6 then for g in 1..end_make loop -- 7
pw7 := pw6||fix_pass(g); comm(pw7);
exit when start_t > stop_t;
end loop; else comm(pw6); end if; -- 7
exit when start_t > stop_t;
end loop; else comm(pw5); end if; -- 6
exit when start_t > stop_t;
end loop; else comm(pw4); end if; -- 5
exit when start_t > stop_t;
end loop; else comm(pw3); end if; -- 4
exit when start_t > stop_t;
end loop; else comm(pw2); end if; -- 3
exit when start_t > stop_t;
end loop; else comm(pw1); end if; -- 2
exit when start_t > stop_t;
end loop; -- 1
dbms_output.put_line('Генерация для '||ma||' знаков. Зафиксировано '||res||' знаков, ошибок - '||err);
commit;
end MAKER_DICT;
/