Oracle SQL Developer 查询推荐的密码设置
Posted
技术标签:
【中文标题】Oracle SQL Developer 查询推荐的密码设置【英文标题】:Oracle SQL Developer Query on recommended password setup 【发布时间】:2021-05-26 10:21:17 【问题描述】:为用户设置随机密码
select
dbms_random.string('L',2) || dbms_random.string('X',6) || '1!' as deflvrpwd,
'$access_request_cri_acc_cas9' as ACNTDN
from dual
新要求
New Hire Details:
Name :John Doe
Region: America
WDID : 876214
WDID 反转和拆分 中间的区域用@符号替换字母A
如果我们遵循您的公式,应该阅读。
= 412@meric@s678
请建议属性与提到的相同。
谢谢
【问题讨论】:
【参考方案1】:这是一种选择;在代码中读取 cmets。
SQL> WITH
2 -- sample data
3 test (name, region, wdid)
4 AS
5 (SELECT 'John Doe', 'America', '876214' FROM DUAL),
6 temp
7 AS
8 -- reverse WDID; don't use undocumented REVERSE function
9 -- replace "A" (or "a") with "@" in REGION
10 ( SELECT name,
11 REPLACE (REPLACE (region, 'A', '@'), 'a', '@') new_region,
12 LISTAGG (letter, '') WITHIN GROUP (ORDER BY lvl DESC) new_wdid
13 FROM ( SELECT SUBSTR (wdid, LEVEL, 1) letter,
14 LEVEL lvl,
15 name,
16 region
17 FROM test
18 CONNECT BY LEVEL <= LENGTH (wdid))
19 GROUP BY name, region)
20 -- finally
21 SELECT SUBSTR (new_wdid, 1, 3) || new_region || SUBSTR (new_wdid, 4) AS result
22 FROM temp;
RESULT
--------------------------------------------------------------------------------
412@meric@678
SQL>
我不知道结果中的s
来自哪里(这个:412@meric@s678)。
【讨论】:
谢谢小脚【参考方案2】:在 SQL 和 PL/SQL 之间进行上下文切换的成本很小,但这听起来不像是大容量或性能关键的事情,因此您可能会发现将逻辑放在函数中更简洁:
create or replace function get_password (p_wdid varchar2, p_region varchar2)
return varchar2 as
l_split pls_integer;
l_password varchar2(30);
begin
-- split WDID halfway, but allow for odd lengths
l_split := floor(length(p_wdid)/2);
-- iterate over the WDID in reverse
for i in reverse 1..length(p_wdid) LOOP
-- when we reach the split point, append the modified region
if i = l_split then
l_password := l_password || translate(p_region, 'Aax', '@@x');
end if;
-- append each WDID character, in reverse order
l_password := l_password || substr(p_wdid, i, 1);
end loop;
return l_password;
end get_password;
/
WDID在循环中反转,修改区域包含在中间点,根据WDID值的长度。
你可以这样做:
select get_password('876214', 'America') from dual;
GET_PASSWORD('876214','AMERICA')
--------------------------------
412@meric@678
这也没有您问题示例中无法解释的“s”。
如果您无法创建函数但使用的是最新版本的 Oracle,那么您可以在 CTE 中定义临时函数:
with
function invert (p_input varchar2) return varchar2 as
l_output varchar2(30);
begin
for i in reverse 1..length(p_input) LOOP
l_output := l_output || substr(p_input, i, 1);
end loop;
return l_output;
end invert;
t (wdid, region) as (
select invert('876214'), translate('America', 'Aax', '@@x')
from dual
)
select substr(wdid, 1, floor(length(wdid)/2))
|| region
|| substr(wdid, floor(length(wdid)/2) + 1)
from t;
得到相同的结果。 (我调用了函数 invert
以避免与未记录的 reverse
函数混淆。)
db<>fiddle 显示两者。
【讨论】:
以上是关于Oracle SQL Developer 查询推荐的密码设置的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL Developer的代码输入框中推荐使用的中文字体
oracle sql developer 查询乱码和文件打开乱码问题
oracle sql developer 能否直接修改sql查询出的数据?
ORACLE11g下如何利用SQL DEVELOPER连接上数据库?
在 PL/SQL Developer 中运行的日期查询显示时间,但在 Oracle SQL Developer 中不显示