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 中不显示

Oracle SQL Developer - 缺少网格的查询结果窗口