目前需要从hr系统里使用etl将用户同步到um系统中。um的user_id是通过函数生成的。比如中文名:张三。生成的um账号(user_id)就是zhangsan001。如果已经有zhangsan001这个用户就+1生成zhangsan002。函数如下
create or replace function generate_UM_id(chinese_word in varchar)
return varchar2
is
seq int; --序列号
PY varchar2 (200); --拼音
begin
select fn_getpy(chinese_word) into PY from dual; --获得拼音
--查询um账号
select max(to_number(decode(REGEXP_SUBSTR(TRIM(user_id),'[0-9]+$')
,null,0,REGEXP_SUBSTR(TRIM(user_id)
,'[0-9]+$'))))+1
into seq from t_user where user_id like PY||'%';
-- select max(to_number(substr(user_id,-3))) into seq from t_user where user_id like PY||'%';
dbms_output.put('sequence ='|| seq);
if (seq >= 1 and seq <10) then
return (PY ||'00'||seq);
elsif (seq >= 10 and seq <100) then
return (PY ||'0'||seq);
else
return(PY ||seq);
end if;
end;
并发问题是。同步数据的时候会抛出主键冲突。大概几万的数据会有几十个。
就是在查询
select max(to_number(decode(REGEXP_SUBSTR(TRIM(user_id),'[0-9]+$')
,null,0,REGEXP_SUBSTR(TRIM(user_id)
,'[0-9]+$'))))+1
into seq from t_user where user_id like PY||'%';
的时候并发插入了同一个拼音zhangsan
。数据库里有zhangsan001
.同一个时间还没插入。并发几条数据都查询是zhangsan001
.插入的时候就都是zhangsan002
.主键冲突。
从小有点语体教。不知道自己有木有吧问题说清楚/糗大了。
求大神呀。小弟想了两天没什么好的头绪。