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

如何编写支持指定各类字符数量的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:15:03