You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:24:04