【发布时间】:2018-11-21 01:20:49
【问题描述】:
我想使用 Oracle SQL 为用户生成唯一的 sAMAccountName。生成唯一名称的逻辑是名字的首字母+整个姓氏。
如果该组合已存在,则在唯一名称的末尾附加 1。 如果第二个组合已经存在,则递增直到达到唯一性。
例如,名为“Tom Kelly”的 5 个用户和名为“Tom Ke”的 3 个用户将具有以下唯一名称:
- 凯利
- TKelly1
- TKelly2
- TKelly3
- TKelly4
- Tke
- TKe1
- TKe2
我已经为此编写了一个程序,但它不能完全工作。我认为在这个过程的查询中需要更新逻辑:
SELECT SUBSTR(Custom_Unique_Name,-1,1) INTO lastletter
FROM (SELECT * FROM (SELECT Custom_Unique_Name FROM
P_USERS WHERE Custom_Unique_Name= item.tempid2 AND
user_id <> item.user_id ORDER BY Custom_Unique_Name
DESC) WHERE ROWNUM<=1);
只读表P_USERS包含主键为"user_id"的所有用户,唯一名称存储在属性"Custom_Unique_Name"中
计算唯一名称后,需要更新主用户表"T_MASTER_USERS"中的属性"PRIMARY_UNIQUE_NAME"。该表的主键也是"user_id",与只读表"P_USERS"中的值相同
DECLARE
lastletter varchar2(10);
anyexists varchar2(10);
lastfive varchar2(10);
CURSOR c_length IS SELECT SUBSTR(first_name,1,1)||(last_name) as
tempid2,LENGTH(last_name) as lengthln, user_id, Custom_Unique_Name
FROM P_USERS;
status varchar2(10);
BEGIN
FOR item in c_length
LOOP
EXIT WHEN c_length%notfound;
lastletter:=0;
SELECT NVL(Custom_Unique_Name,0) INTO status FROM P_USERS
WHERE USER_ID=item.user_id;
IF status <> '0' THEN /* Checks if the person already has a
unique id */
NULL; /* If yes, then do nothing and exit the program */
ELSE
SELECT COUNT(*) INTO anyexists FROM (SELECT
Custom_Unique_Name FROM P_USERS
WHERE Custom_Unique_Name = item.tempid2 AND user_id <>
item.user_id);
IF anyexists=0 THEN /* Check if unique id exists for
the user. If not, then assign unique_id to the user */
UPDATE T_MASTER_USERS SET
PRIMARY_UNIQUE_NAME=item.tempid2 WHERE
user_id=item.user_id;
ELSE
SELECT SUBSTR(Custom_Unique_Name,-1,1) INTO lastletter
FROM (SELECT * FROM (SELECT Custom_Unique_Name FROM
P_USERS WHERE Custom_Unique_Name= item.tempid2 AND
user_id <> item.user_id ORDER BY Custom_Unique_Name
DESC) WHERE ROWNUM<=1);
IF LENGTH(TRIM(TRANSLATE(lastletter, '
+-.0123456789',' '))) > 0 THEN /* Checks if the count
of equivalent unique names if a number. If not, append
1*/
UPDATE T_MASTER_USERS SET
PRIMARY_UNIQUE_NAME=item.tempid2||'1' WHERE
user_id=item.user_id;
ELSE
lastletter:=lastletter+1;
UPDATE T_MASTER_USERS SET
PRIMARY_UNIQUE_NAME=item.tempid2||lastletter WHERE
user_id=item.user_id;
END IF;
END IF;
END IF;
END LOOP;
END;
【问题讨论】:
-
我以前曾构建过这样的系统,我发现在我正在构建的任何应用程序的客户端代码中处理它非常更容易...在那里生成一个字符串,然后尝试对具有 UNIQUE 约束的列进行插入,并在失败时继续迭代,直到成功。最近,我希望系统在创建名称之前确保存在either a manual human review, a choice is offered, or the username is a valid e-mail address from an outside system。