随机密码生成函数
function for random password generate
我想要一个生成随机密码的功能。我会给功能
四个参数为密码将包含多少个数字,密码将包含多少个大写字母,密码将包含多少个小写字母以及密码将包含多少个特殊字符以及 return 密码将是这些输入参数的混合。
create or replace function(
number_of_digits in number,
no_of_special_characters in number,
no_of_lower in number,
no_of_upper in number
) return varchar2
as
password
您可以使用函数dbms_random.string('P', length)
。根据 Oracle 的文档,P
参数打印所有可打印字符。
这是一个例子:
select replace(dbms_random.string('P', 10), ' ', 'x') str from dual;
我在这个例子中使用了替换,以消除 space 的可能性,因为用户有时很难理解它们。
您可以使用:
create function generate_password(
no_of_digits in number,
no_of_special_characters in number,
no_of_lower in number,
no_of_upper in number
) return varchar2
AS
password VARCHAR2(4000);
digits CONSTANT VARCHAR2(10) := '0123456789';
lower CONSTANT VARCHAR2(26) := 'abcdefghijklmnopqrstuvwxyz';
upper CONSTANT VARCHAR2(26) := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
special CONSTANT VARCHAR2(32) := '!"£$%^&*()-_=+{}[]<>,.\|/?;:''@#';
BEGIN
SELECT LISTAGG(letter, NULL) WITHIN GROUP (ORDER BY DBMS_RANDOM.VALUE)
INTO password
FROM (
SELECT SUBSTR(
digits,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(digits) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_digits
UNION ALL
SELECT SUBSTR(
lower,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(lower) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_lower
UNION ALL
SELECT SUBSTR(
upper,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(upper) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_upper
UNION ALL
SELECT SUBSTR(
special,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(special) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_special_characters
);
RETURN password;
END;
/
然后:
SELECT generate_password(5,3,4,4)
FROM DUAL
CONNECT BY LEVEL <= 5;
可能随机输出:
GENERATE_PASSWORD(5,3,4,4)
1>9zq$Qw%E16fJ8B
J$rYKtH2813vt]7}
fRh2bS8U0.55]Vs=
{N6Zd£Or8e5u5R|4
H9c:_5VFmyZ58't7
db<>fiddle here
我想要一个生成随机密码的功能。我会给功能 四个参数为密码将包含多少个数字,密码将包含多少个大写字母,密码将包含多少个小写字母以及密码将包含多少个特殊字符以及 return 密码将是这些输入参数的混合。
create or replace function(
number_of_digits in number,
no_of_special_characters in number,
no_of_lower in number,
no_of_upper in number
) return varchar2
as
password
您可以使用函数dbms_random.string('P', length)
。根据 Oracle 的文档,P
参数打印所有可打印字符。
这是一个例子:
select replace(dbms_random.string('P', 10), ' ', 'x') str from dual;
我在这个例子中使用了替换,以消除 space 的可能性,因为用户有时很难理解它们。
您可以使用:
create function generate_password(
no_of_digits in number,
no_of_special_characters in number,
no_of_lower in number,
no_of_upper in number
) return varchar2
AS
password VARCHAR2(4000);
digits CONSTANT VARCHAR2(10) := '0123456789';
lower CONSTANT VARCHAR2(26) := 'abcdefghijklmnopqrstuvwxyz';
upper CONSTANT VARCHAR2(26) := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
special CONSTANT VARCHAR2(32) := '!"£$%^&*()-_=+{}[]<>,.\|/?;:''@#';
BEGIN
SELECT LISTAGG(letter, NULL) WITHIN GROUP (ORDER BY DBMS_RANDOM.VALUE)
INTO password
FROM (
SELECT SUBSTR(
digits,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(digits) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_digits
UNION ALL
SELECT SUBSTR(
lower,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(lower) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_lower
UNION ALL
SELECT SUBSTR(
upper,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(upper) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_upper
UNION ALL
SELECT SUBSTR(
special,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(special) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_special_characters
);
RETURN password;
END;
/
然后:
SELECT generate_password(5,3,4,4)
FROM DUAL
CONNECT BY LEVEL <= 5;
可能随机输出:
GENERATE_PASSWORD(5,3,4,4) 1>9zq$Qw%E16fJ8B J$rYKtH2813vt]7} fRh2bS8U0.55]Vs= {N6Zd£Or8e5u5R|4 H9c:_5VFmyZ58't7
db<>fiddle here