powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Генерация логина
24 сообщений из 24, страница 1 из 1
Генерация логина
    #39580042
IsaevSergey1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.

Помогите, пожалуйста, с процедурой генерации логина.

Пример таблицы:

Фамилия-----Имя-------------Отчество---------------Логин
Артёмов---------Игорь-----------Иванович
Грач-------------Сергей----------Анатольевич
Зимин-----------Антон-----------Николавич
Артёмов---------Иван------------Дмитриевич
Артёмов---------Игнат-----------Дмитриевич

Логика такая : логин должен состоять из первой буквы имени + фамилия полностью. Если логин совпадает с другим логином, то после первой буквы имени добавляется первая буква фамилия, но только у одного (нового) логина. Если всё равно появляются совпадения, то у нового логина добавляется вторая буква имени.
...
Рейтинг: 0 / 0
Генерация логина
    #39580058
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Генерация логина
    #39580062
IsaevSergey1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

Справедливо конечно, но помощь реально нужна. Получилось сделать, что бы логины формировались, но когда процедура проходит второй раз по списку логинов и находит одинаковые логины, она меняет оба. Если есть идея , как сделать ,чтобы менялся только новый ( следующий в списке) , буду очень признателен.
...
Рейтинг: 0 / 0
Генерация логина
    #39580065
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IsaevSergey1Получилось сделать

Т.е. выбрали


Путь 2. "Я хочу разобраться и сделать это задание, но мне нужна помощь".
Этот подход подразумевает, что помимо условия задачи, будут опубликованы реальные попытки автора что-то сделать
...
Рейтинг: 0 / 0
Генерация логина
    #39580067
IsaevSergey1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

Да, но код на другом ПК.
примерно:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure blablalba 
is
c_proc constant varchar2(50) := 'packagename.blablalba';

begin 
update tablename  set login = tr_letter(subsrt(name,1,1) || lastname);
commit;

for dummy in (select login from tablename  group by login having count(*)>1) loop
update tablename  set login = tr_letter(subsrt(name,1,1) || subsrt(patronymic,1,1) || lastname);
commit;
end loop;
end;



tr_letter - транслитерирует на анг.

Как правильно задать условие, чтобы менялся только новый ( следующий в списке ) логин.
...
Рейтинг: 0 / 0
Генерация логина
    #39580069
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IsaevSergey1код на другом ПК.

Можете сразу научиться писать переносимый код.
Пока ждал вашего варианта, налабал по-быстрому.
В предположении, что уже надо создавать логины :).

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
declare
  q varchar2(1000);
begin
  
for c in (

with t as
(
  select 'Андрей' name1, 'Дмитриевич' name2, 'Маслов' name3 from dual union all
  select 'Ирина' name1, 'Дмитриевна' name2, 'Маслова' name3 from dual union all
  select 'Дмитрий' name1, 'Евгеньевич' name2, 'Маслов' name3 from dual union all
  select 'Сергей' name1, 'Петрович' name2, 'Иъванов' name3 from dual
)
select new_login, new_login2, (select username from all_users where username = new_login) existing_user
from (
select t.name1, t.name2, t.name3,
       replace(translate(upper(substr(t.name1, 1, 1)||t.name3), 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', 'ABVGDEEZZIIKLMNOPRSTUFHCCSS Y EUA'), ' ', '') new_login,
       replace(translate(upper(substr(t.name1, 1, 1)||substr(t.name2, 1, 1)||t.name3), 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', 'ABVGDEEZZIIKLMNOPRSTUFHCCSS Y EUA'), ' ', '') new_login2
  from t
)
) loop
  begin
      if c.existing_user is null then
        q := 'create user '||c.new_login||' identified by "123"';
      else
        q := 'create user '||c.new_login2||' identified by "123"';
      end if;
      dbms_output.put_line(q);
      execute immediate q;
   exception when others then
      dbms_output.put_line(q ||': '||sqlerrm);
   end;
end loop;
end;



Как правильно задать условие, чтобы менялся только новый ( следующий в списке ) логин.

Код: plsql
1.
update tablename set login = ... where login = 'IVANOV' and ID = (здесь определение условия, что значит "следующий в списке")
...
Рейтинг: 0 / 0
Генерация логина
    #39580073
IsaevSergey1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

Большое спасибо за помощь!
...
Рейтинг: 0 / 0
Генерация логина
    #39580076
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdmМожете сразу научиться писать переносимый код.Чья бы корова мычала.
dmdmdm
Код: plsql
1.
if c.existing_user

Руки обгоняют голову. Поря её включить.
dmdmdm
Код: plsql
1.
update tablename set login = ... where login = 'IVANOV' and ID = (здесь определение условия, что значит "следующий в списке")

Бред ни о чём.
...
Рейтинг: 0 / 0
Генерация логина
    #39580088
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IsaevSergey1Если логин совпадает с другим логином, то после первой буквы имени добавляется первая буква фамилия, но только у одного (нового) логина.Лаба? Сессия? Дичайший алгоритм высосан из пальца каким-то изощрённым преподом.
...
Рейтинг: 0 / 0
Генерация логина
    #39580091
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IsaevSergey1Если всё равно появляются совпаденияВ курсе, что нередко в одном месте встречаются трёх-компонентные тёзки?
...
Рейтинг: 0 / 0
Генерация логина
    #39580232
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, работая в одном небольшом холдинге в начале нулевых, встречал аж двух своих полных тёзок.
Забавно было бы нам троим логин по такому алгоритму подбирать.
...
Рейтинг: 0 / 0
Генерация логина
    #39580233
Karbafosвстречал аж двухС таким-то именем?
...
Рейтинг: 0 / 0
Генерация логина
    #39580785
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что нужен результат вроде такого:
Код: html
1.
2.
3.
4.
5.
6.
IIvanov
IvIvanov
IvaIvanov
IvanIvanov
Ivan1Ivanov
Ivan2Ivanov...



substr + row_number () over (partition by фамилия + имя order by что-нибудь descending)
...
Рейтинг: 0 / 0
Генерация логина
    #39580845
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnSi_SrЯ так понимаю, что нужен результат вроде такого:
Код: html
1.
2.
3.
4.
5.
6.
IIvanov
IvIvanov
IvaIvanov
IvanIvanov
Ivan1Ivanov
Ivan2Ivanov...



substr + row_number () over (partition by фамилия + имя order by что-нибудь descending)

Для

Артёмов---------Иван------------Дмитриевич
Артёмов---------Игнат-----------Дмитриевич
Артёмов---------Игор------------Дмитриевич

....
stax
...
Рейтинг: 0 / 0
Генерация логина
    #39580846
Фотография lLocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IsaevSergey1dmdmdm,
...Как правильно задать условие, чтобы менялся только новый ( следующий в списке ) логин.

Потому что логин вообще не нужно повторно генерить для сотрудников, кому его сделали ранее, кроме смены фамилии )))

Иначе в вашем варианте возможна такая проблема:
1) Есть две Ивановы Анна: Ivanova и AIvanova
2) одна (первая, у которой был логин Ivanova) женилась и поменяла фамилию, стала Петрова.
Итог: Для нее сделали логин Petrova, а для второй переделали логин на Ivanova

Логин нужно генерить, только если это новый человек или произошла смена ФИО.
...
Рейтинг: 0 / 0
Генерация логина
    #39580849
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lLocust,

прикиньте, приняли на работу трех человек сразу (никто из них фамилий не менял)

Артёмов---------Иван------------Дмитриевич
Артёмов---------Игнат-----------Дмитриевич
Артёмов---------Игор------------Дмитриевич

....
stax
...
Рейтинг: 0 / 0
Генерация логина
    #39580877
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верно, Станислав, не заметил.
Сходу не могу простое решение придумать.
...
Рейтинг: 0 / 0
Генерация логина
    #39580966
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnSi_SrВерно, Станислав, не заметил.
Сходу не могу простое решение придумать.
мне не понятно что должно в результате быть
напр какие пароли для

Артёмов---------Роман-----------Дмитриевич
Артёмов---------Иван------------Дмитриевич
Артёмов---------Игнат-----------Дмитриевич
Артёмов---------Игор------------Дмитриевич
Артёмов---------Игор------------Леонидович
Артёмов---------Игор------------Степанович


зи

Лоз---------Анна
Лоз---------Анна
Лоза--------Наташа

.....
stax
...
Рейтинг: 0 / 0
Генерация логина
    #39581000
Загги
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StaxlLocust,

прикиньте, приняли на работу трех человек сразу (никто из них фамилий не менял)

Артёмов---------Иван------------Дмитриевич
Артёмов---------Игнат-----------Дмитриевич
Артёмов---------Игор------------Дмитриевич

....
stax
Обратная нативная идентификация и не требуется же, всегда можно заглянуть в справочник логинов.
Артёмов---------Иван------------Дмитриевич-----IArtemov
Артёмов---------Игнат-----------Дмитриевич-----IgArtemov
Артёмов---------Игор------------Дмитриевич-----IgoArtemov
Артёмов---------Игор------------Дмитриевич-----IgorArtemov
Артёмов---------Игор------------Дмитриевич-----IgorArtemov2
...
Рейтинг: 0 / 0
Генерация логина
    #39581006
IsaevSergey1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно коряво написано, но работает.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
procedure GEN_LOGIN
is

c_proc varchar2(200) := 'blabla.GEN_LOGIN';



  cursor cur_duplicate  is
SELECT login  FROM integ_for_w GROUP BY login HAVING count(*)>1;



begin
  update integ_for_w set login = tr_letter(substr(name1, 1,1)| |lastname );
  commit;
for ind in cur_duplicate loop
  update integ_for_w set login = tr_letter(substr(name1, 1,1)|| substr( name2, 1,1)|| lastname)  where  login in (SELECT login  FROM integ_for_w GROUP BY login HAVING count(*)>1)  and id > (select avg(id) from integ_for_w where  login in (SELECT login  FROM integ_for_w GROUP BY login HAVING count(*)>1)); 
  commit;
  end loop;
for ind in cur_duplicate loop
  update integ_for_w set login = tr_letter(substr(name1, 1,2)|| substr( name2, 1,1)|| lastname) where  login in (SELECT login  FROM integ_for_w GROUP BY login HAVING count(*)>1)  and id > (select avg(id) from integ_for_w where  login in (SELECT login  FROM integ_for_w GROUP BY login HAVING count(*)>1)); 
commit;
  end loop;  
for ind in cur_duplicate loop
  update integ_for_w set login = tr_letter(substr(name1, 1,3)|| substr( name2, 1,1)|| lastname) where  login in (SELECT login  FROM integ_for_w GROUP BY login HAVING count(*)>1)  and id > (select avg(id) from integ_for_w where  login in (SELECT login  FROM integ_for_w GROUP BY login HAVING count(*)>1)); 
commit;
  end loop;  
  
  for ind in cur_duplicate loop
  update integ_for_w set login = tr_letter(name1|| substr( name2, 1,1)|| lastname) where  login in (SELECT login  FROM integ_for_w GROUP BY login HAVING count(*)>1)  and id > (select avg(id) from integ_for_w where  login in (SELECT login  FROM integ_for_w GROUP BY login HAVING count(*)>1)); 
commit;
  end loop; 
 
   
end GEN_LOGIN;
...
Рейтинг: 0 / 0
Генерация логина
    #39581025
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Загги,

c
Артёмов---------Игор------------Дмитриевич-----IgorArtemov 2

У меня загвоздочка, надо дополнительно изголятся

зы
подозревл что мож надо
Артёмов---------Иван------------Дмитриевич-----IArtemov
Артёмов---------Игнат-----------Дмитриевич-----gArtemov
Артёмов---------Игор------------Дмитриевич-----oArtemov
...

.....
stax
...
Рейтинг: 0 / 0
Генерация логина
    #39581030
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IsaevSergey1,

а если дубликатов больше "трех"

зи
для простейшіх случав
update integ_for_w set login = tr_letter(substr(name1, 1, rownum )... --rownum+1

....
stax
...
Рейтинг: 0 / 0
Генерация логина
    #39581037
IsaevSergey1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

в моём случаю думаю, что хватит.
Спасибо.
...
Рейтинг: 0 / 0
Генерация логина
    #39594573
IsaevSergey1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если кому-то поможет, вот итоговый вариант.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
 --формирование логинов
    for ind in (select id
                      ,lastname
                      ,name1
                      ,name2
                  from table_emp
                 where login is null)
    loop
      v_lastn_web := ind.lastname;
      v_lastn_web := regexp_substr(v_lastn_web, '[^[[:space:]-]+');
      n_counter   := 1;
      loop
        begin
        
          n_login := 0;
        
          if n_counter = 1 then
            n_name1 := 1;
            n_name2 := 0;
          elsif n_counter = 2 then
            n_name1 := 1;
            n_name2 := 1;
          elsif n_counter > 2 then
            n_name1 := n_counter - 1;
            n_name2 := 1;
          end if;
        
          if n_counter > 0 then
            v_end_log:= tr_letter(substr(ind.name1, 1, n_name1)) ||
                         tr_letter(substr(ind.name2, 1, n_name2)) ||
                         tr_letter(v_lastn_web);
          end if;
        
          select login
            into v_prav_log
            from table_emp
           where login = v_end_log;
        
          if v_prav_log is not null then
            n_counter := n_counter + 1;
          end if;
        
        exception
          when no_data_found then
            update table_emp i
               set i.login = v_end_log
             where i.id = ind.id;
            n_login := 1;
          
        end;
      
        exit when(n_login = 1 or n_counter = 8 or ind.lastname is null);
      end loop;
    end loop;
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Генерация логина
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]