function auth_pwgen return varchar2 is
l_pos integer;
l_pw varchar2(100);
l_c varchar2(100) := 'bcdfghjklmnprstvwz'; --consonants
l_v varchar2(100) := 'aeiou'; --vowels
l_a varchar2(100) := l_c || l_v; --both
l_s varchar2(100) := '!@#$%^&*()';
begin
--use three syllables...
for ii in 1 .. 3
loop
l_pw := l_pw || substr(l_c, trunc(dbms_random.value(0, length(l_c))), 1);
l_pw := l_pw || substr(l_v, trunc(dbms_random.value(0, length(l_v))), 1);
l_pw := l_pw || substr(l_a, trunc(dbms_random.value(0, length(l_a))), 1);
end loop;
--... Make one Uppercase
l_pos := round(dbms_random.value(1, length(l_pw)));
l_pw := substr(l_pw, 1, l_pos - 1)
|| upper(substr(l_pw, l_pos, 1))
|| substr(l_pw, l_pos + 1);
--... and add a nice number
l_pw := l_pw || round(dbms_random.value(10, 99));
--... and add a special character
l_pw := l_pw || substr(l_s, dbms_random.value(1, length(l_s)), 1);
return l_pw;
end auth_pwgen;