Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Генерация логина  [new]
IsaevSergey1
Member

Откуда:
Сообщений: 12
Привет.

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

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

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

Логика такая : логин должен состоять из первой буквы имени + фамилия полностью. Если логин совпадает с другим логином, то после первой буквы имени добавляется первая буква фамилия, но только у одного (нового) логина. Если всё равно появляются совпадения, то у нового логина добавляется вторая буква имени.
6 янв 18, 14:03    [21084521]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
Студентам, желающим помощи.
6 янв 18, 14:55    [21084561]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
IsaevSergey1
Member

Откуда:
Сообщений: 12
dmdmdm,

Справедливо конечно, но помощь реально нужна. Получилось сделать, что бы логины формировались, но когда процедура проходит второй раз по списку логинов и находит одинаковые логины, она меняет оба. Если есть идея , как сделать ,чтобы менялся только новый ( следующий в списке) , буду очень признателен.
6 янв 18, 15:08    [21084584]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
IsaevSergey1
Получилось сделать


Т.е. выбрали


Путь 2. "Я хочу разобраться и сделать это задание, но мне нужна помощь".
Этот подход подразумевает, что помимо условия задачи, будут опубликованы реальные попытки автора что-то сделать
6 янв 18, 15:23    [21084605]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
IsaevSergey1
Member

Откуда:
Сообщений: 12
dmdmdm,

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

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 - транслитерирует на анг.

Как правильно задать условие, чтобы менялся только новый ( следующий в списке ) логин.
6 янв 18, 15:34    [21084618]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
IsaevSergey1
код на другом ПК.


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

+
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;


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


update tablename set login = ... where login = 'IVANOV' and ID = (здесь определение условия, что значит "следующий в списке")
6 янв 18, 15:42    [21084629]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
IsaevSergey1
Member

Откуда:
Сообщений: 12
dmdmdm,

Большое спасибо за помощь!
6 янв 18, 15:48    [21084635]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
Elic
Member

Откуда:
Сообщений: 29979
dmdmdm
Можете сразу научиться писать переносимый код.
Чья бы корова мычала.
dmdmdm
if c.existing_user
Руки обгоняют голову. Поря её включить.
dmdmdm
update tablename set login = ... where login = 'IVANOV' and ID = (здесь определение условия, что значит "следующий в списке")
Бред ни о чём.
6 янв 18, 15:53    [21084640]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
Elic
Member

Откуда:
Сообщений: 29979
IsaevSergey1
Если логин совпадает с другим логином, то после первой буквы имени добавляется первая буква фамилия, но только у одного (нового) логина.
Лаба? Сессия? Дичайший алгоритм высосан из пальца каким-то изощрённым преподом.
6 янв 18, 16:20    [21084668]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
Elic
Member

Откуда:
Сообщений: 29979
IsaevSergey1
Если всё равно появляются совпадения
В курсе, что нередко в одном месте встречаются трёх-компонентные тёзки?
6 янв 18, 16:25    [21084675]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
Karbafos
Member

Откуда:
Сообщений: 469
Я, работая в одном небольшом холдинге в начале нулевых, встречал аж двух своих полных тёзок.
Забавно было бы нам троим логин по такому алгоритму подбирать.
7 янв 18, 04:06    [21085488]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
Следствие ведут колобки
Guest
Karbafos
встречал аж двух
С таким-то именем?
7 янв 18, 04:16    [21085490]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
AnSi_Sr
Member

Откуда:
Сообщений: 134
Я так понимаю, что нужен результат вроде такого:
IIvanov
IvIvanov
IvaIvanov
IvanIvanov
Ivan1Ivanov
Ivan2Ivanov...


substr + row_number () over (partition by фамилия + имя order by что-нибудь descending)
9 янв 18, 04:14    [21088608]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2787
AnSi_Sr
Я так понимаю, что нужен результат вроде такого:
IIvanov
IvIvanov
IvaIvanov
IvanIvanov
Ivan1Ivanov
Ivan2Ivanov...


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


Для

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

....
stax
9 янв 18, 10:14    [21088931]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
lLocust
Member

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


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

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

Логин нужно генерить, только если это новый человек или произошла смена ФИО.
9 янв 18, 10:15    [21088937]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2787
lLocust,

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

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

....
stax
9 янв 18, 10:28    [21088970]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
AnSi_Sr
Member

Откуда:
Сообщений: 134
Верно, Станислав, не заметил.
Сходу не могу простое решение придумать.
9 янв 18, 11:14    [21089148]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2787
AnSi_Sr
Верно, Станислав, не заметил.
Сходу не могу простое решение придумать.

мне не понятно что должно в результате быть
напр какие пароли для

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


зи

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

.....
stax
9 янв 18, 12:26    [21089588]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
Загги
Guest
Stax
lLocust,

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

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

....
stax

Обратная нативная идентификация и не требуется же, всегда можно заглянуть в справочник логинов.
Артёмов---------Иван------------Дмитриевич-----IArtemov
Артёмов---------Игнат-----------Дмитриевич-----IgArtemov
Артёмов---------Игор------------Дмитриевич-----IgoArtemov
Артёмов---------Игор------------Дмитриевич-----IgorArtemov
Артёмов---------Игор------------Дмитриевич-----IgorArtemov2
9 янв 18, 13:09    [21089777]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
IsaevSergey1
Member

Откуда:
Сообщений: 12
Возможно коряво написано, но работает.


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;
9 янв 18, 13:14    [21089809]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2787
Загги,

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

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

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

.....
stax
9 янв 18, 13:28    [21089865]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2787
IsaevSergey1,

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

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

....
stax
9 янв 18, 13:34    [21089891]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
IsaevSergey1
Member

Откуда:
Сообщений: 12
Stax,

в моём случаю думаю, что хватит.
Спасибо.
9 янв 18, 13:45    [21089942]     Ответить | Цитировать Сообщить модератору
 Re: Генерация логина  [new]
IsaevSergey1
Member

Откуда:
Сообщений: 12
Если кому-то поможет, вот итоговый вариант.

 --формирование логинов
    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;
1 фев 18, 07:15    [21156318]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить