如何在PLSQL中编写支持指定各类型字符数量的随机密码生成函数
PLSQL随机密码生成函数Genpass实现
功能说明
- 按传入的四类字符数量要求生成随机密码,返回值为VARCHAR2类型
- 入参顺序依次为:数字字符个数、大写字母个数、小写字母个数、特殊字符个数
- 生成的密码会自动打乱字符顺序,避免按字符类型固定排序的安全隐患
完整实现代码
CREATE OR REPLACE FUNCTION Genpass( p_num_count NUMBER, -- 数字字符个数 p_upper_count NUMBER, -- 大写字母个数 p_lower_count NUMBER, -- 小写字母个数 p_special_count NUMBER -- 特殊字符个数 ) RETURN VARCHAR2 IS v_num_str VARCHAR2(100) := '0123456789'; v_upper_str VARCHAR2(100) := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; v_lower_str VARCHAR2(100) := 'abcdefghijklmnopqrstuvwxyz'; v_special_str VARCHAR2(100) := '!@#$%^&*()_+-=[]{}|;:,.<>?'; -- 可根据业务需求调整特殊字符范围 v_temp_str VARCHAR2(4000) := ''; v_result VARCHAR2(4000) := ''; v_len NUMBER; v_pos NUMBER; BEGIN -- 生成指定数量数字 FOR i IN 1..p_num_count LOOP v_temp_str := v_temp_str || SUBSTR(v_num_str, DBMS_RANDOM.VALUE(1, LENGTH(v_num_str)), 1); END LOOP; -- 生成指定数量大写字母 FOR i IN 1..p_upper_count LOOP v_temp_str := v_temp_str || SUBSTR(v_upper_str, DBMS_RANDOM.VALUE(1, LENGTH(v_upper_str)), 1); END LOOP; -- 生成指定数量小写字母 FOR i IN 1..p_lower_count LOOP v_temp_str := v_temp_str || SUBSTR(v_lower_str, DBMS_RANDOM.VALUE(1, LENGTH(v_lower_str)), 1); END LOOP; -- 生成指定数量特殊字符 FOR i IN 1..p_special_count LOOP v_temp_str := v_temp_str || SUBSTR(v_special_str, DBMS_RANDOM.VALUE(1, LENGTH(v_special_str)), 1); END LOOP; -- 打乱所有字符顺序 v_len := LENGTH(v_temp_str); WHILE v_len > 0 LOOP v_pos := DBMS_RANDOM.VALUE(1, v_len); v_result := v_result || SUBSTR(v_temp_str, v_pos, 1); v_temp_str := SUBSTR(v_temp_str, 1, v_pos - 1) || SUBSTR(v_temp_str, v_pos + 1); v_len := v_len - 1; END LOOP; RETURN v_result; EXCEPTION WHEN OTHERS THEN RETURN NULL; -- 可根据业务需要修改异常返回逻辑 END Genpass; /
使用说明
- 调用语法:
SELECT Genpass(数字个数, 大写字母个数, 小写字母个数, 特殊字符个数) FROM DUAL; - 示例:执行
SELECT Genpass(2,2,1,2) FROM DUAL;即可得到符合要求的随机密码,输出示例:8kD@2Fq,每次调用返回结果均不同 - 若需要使用
Genpassword作为函数名,只需修改代码第一行的函数名Genpass为Genpassword即可
注意事项
- 执行函数前需要确保当前用户有
DBMS_RANDOM包的调用权限,无权限可联系DBA执行授权语句:GRANT EXECUTE ON SYS.DBMS_RANDOM TO 你的用户名; - 不需要某类字符时,对应参数传0即可,例如不需要特殊字符时传入第四个参数为0
- 返回密码总长度为四个入参数值之和,单次生成总长度建议不超过4000,避免超出字段长度限制
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

