如何编写支持指定各类字符数量的SQL随机密码生成函数
Oracle随机密码生成函数实现
该函数接收四个输入参数,分别指定密码包含的数字个数、大写字母个数、小写字母个数、特殊字符个数,返回随机打乱后的符合要求的密码字符串。
完整实现代码
create or replace function generate_random_password( number_of_digits in number, no_of_special_characters in number, no_of_lower in number, no_of_upper in number ) return varchar2 as -- 定义各类字符的取值池,特殊字符可根据业务规则调整 v_digit_pool constant varchar2(10) := '0123456789'; v_upper_pool constant varchar2(26) := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; v_lower_pool constant varchar2(26) := 'abcdefghijklmnopqrstuvwxyz'; v_special_pool constant varchar2(30) := '!@#$%^&*()_+-=[]{}|;:,.<>?'; -- 临时存储变量 v_all_chars varchar2(4000) := ''; v_password varchar2(4000) := ''; v_random_idx number; begin -- 参数合法性校验 if number_of_digits < 0 or no_of_special_characters < 0 or no_of_lower <0 or no_of_upper <0 then raise_application_error(-20001, '各类字符数量参数不能为负数'); end if; -- 生成指定数量的数字 for i in 1..number_of_digits loop v_random_idx := floor(dbms_random.value(1, length(v_digit_pool)+1)); v_all_chars := v_all_chars || substr(v_digit_pool, v_random_idx, 1); end loop; -- 生成指定数量的大写字母 for i in 1..no_of_upper loop v_random_idx := floor(dbms_random.value(1, length(v_upper_pool)+1)); v_all_chars := v_all_chars || substr(v_upper_pool, v_random_idx, 1); end loop; -- 生成指定数量的小写字母 for i in 1..no_of_lower loop v_random_idx := floor(dbms_random.value(1, length(v_lower_pool)+1)); v_all_chars := v_all_chars || substr(v_lower_pool, v_random_idx, 1); end loop; -- 生成指定数量的特殊字符 for i in 1..no_of_special_characters loop v_random_idx := floor(dbms_random.value(1, length(v_special_pool)+1)); v_all_chars := v_all_chars || substr(v_special_pool, v_random_idx, 1); end loop; -- 打乱所有字符顺序生成最终密码 while length(v_all_chars) > 0 loop v_random_idx := floor(dbms_random.value(1, length(v_all_chars)+1)); v_password := v_password || substr(v_all_chars, v_random_idx, 1); v_all_chars := substr(v_all_chars, 1, v_random_idx-1) || substr(v_all_chars, v_random_idx+1); end loop; return v_password; end; /
使用示例
-- 示例:生成包含2个数字、1个特殊字符、3个小写字母、2个大写字母的随机密码 select generate_random_password(2,1,3,2) as random_pwd from dual;
内容的提问来源于stack exchange,提问作者asim
相关产品推荐
相关产品推荐

