Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
1

Используя PlSQL Требуется получить список пользователей, которые совершили подряд

18.05.2014, 19:53. Показов 2859. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Буду благодарна за помощь в решении задачи!
Решить задачку нужно используя курсоры, вложенные или индексные таблицы, а может быть даже и массив.
Подскажите алгоритм, пожалуйста.
В таблицу записана информация, об удачных и неудачных попытках подключения к базе данных (Пользователь, Время, Удачно/Неудачно). Требуется получить список пользователей, которые совершили подряд N неудачных попыток подключения. После N подряд неудачных попыток подключения отсчет попыток начинается сначала. Величина N задается как параметр.
Это мой набросок.
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DECLARE
CURSOR c_status_cursor IS
SELECT Client, Status
FROM CON_1;
v_client CON_1.client%TYPE;
v_status CON_1.status%TYPE;
v_connect_record c_status_cursor%ROWTYPE;
--v_limit number:=3;
BEGIN
OPEN  c_status_cursor;
FETCH c_status_cursor INTO v_client, v_status;
WHILE c_status_cursor%found
LOOP 
INSERT INTO CONNECT_NAME
VALUES(v_client, v_status);
FETCH c_status_cursor INTO v_client, v_status;
END LOOP;
CLOSE c_status_cursor;
END;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2014, 19:53
Ответы с готовыми решениями:

Получить список пользователей, которые не используют базу в течении определенного времени
Добрый день! В SQL знания практически нулевые, поэтому нужна помощь в написании запроса, который...

Получить список пользователей, относящихся к группе с наибольшим числом пользователей
Дали задание: "Получить список пользователей относящихся к группе с наибольшим числом...

Вывести список пользователей которые не в контакте
Добрый день. У меня две таблицы в базе данных users и users_friends. Я хотел бы вывести список...

Получить список пользователей из AD
active directory групп имеется около 50 нужно получить список групп и пользователей в них в...

26
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
20.05.2014, 13:22  [ТС] 21
Author24 — интернет-сервис помощи студентам
mlc, спасибо большое меня это направило в нужное русло, сейчас попытаюсь чуть по- другому., ибо для меня что-то все равно не ясно.
Как я понимаю курсор должен быть с конструкцией WHERE CURRENT OF...
0
25 / 25 / 10
Регистрация: 20.09.2009
Сообщений: 110
20.05.2014, 14:27 22
я вам дал готовый рабочий курсор. Вам остается только лишь объявить его в plsql и выводить данные этого курсора
0
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
20.05.2014, 15:24  [ТС] 23
Цитата Сообщение от mlc Посмотреть сообщение
я вам дал готовый рабочий курсор. Вам остается только лишь объявить его в plsql и выводить данные этого курсора
DBMS_OUTPUT - я организую,
но что-то нем не разобраться с вашим решением.
0
25 / 25 / 10
Регистрация: 20.09.2009
Сообщений: 110
20.05.2014, 16:01 24
SQL
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
55
56
57
58
59
60
61
62
63
64
65
CREATE TABLE temp_table(client varchar2(50), dt DATE, STATUS varchar2(3));
 
TABLE TEMP_TABLE created.
Elapsed: 00:00:00.071
/
INSERT INTO temp_table SELECT * FROM (
  SELECT 'Иванов' client, to_date('19.05.2014 12:20:05') dt, 'no' STATUS FROM dual
    UNION ALL
  SELECT 'Петров', to_date('19.05.2014 12:26:27') ,'no' FROM dual
    UNION ALL
  SELECT 'Иванов', to_date('19.05.2014 12:26:29') ,'no' FROM dual
    UNION ALL
  SELECT 'Сидоров', to_date('19.05.2014 12:29:47') ,'no' FROM dual
    UNION ALL
  SELECT 'Иванов', to_date('19.05.2014 12:33:31') ,'no' FROM dual
    UNION ALL
  SELECT 'Петров', to_date('19.05.2014 12:36:21') ,'yes' FROM dual
    UNION ALL
  SELECT 'Петров', to_date('19.05.2014 12:36:51') ,'no' FROM dual
    UNION ALL
  SELECT 'Сидоров', to_date('19.05.2014 12:36:57') ,'yes' FROM dual
    UNION ALL
  SELECT 'Петров', to_date('19.05.2014 12:46:24') ,'no' FROM dual
    UNION ALL
  SELECT 'Петров', to_date('19.05.2014 12:56:29') ,'no' FROM dual);
  
10 ROWS inserted.
Elapsed: 00:00:00.005
/
DECLARE
  ln$limit_fail_connection NUMBER := 3;
  lr$row_ temp_table%rowtype;
  cursor$get_user sys_refcursor;  
BEGIN  
  OPEN cursor$get_user FOR q'[select  
                              client, dt, status 
                            from
                            (
                              select t.*, 
                                row_number()over(partition by client order by dt desc) rn,
                                count(nullif(status,'yes'))over(partition by client order by dt desc rows between current row and 2 following) x
                              from temp_table t
                            )
                            where rn = 1 and x = :1]' USING ln$limit_fail_connection;
  loop  
    fetch cursor$get_user INTO lr$row_;
    exit WHEN cursor$get_user%notfound;
      
      dbms_output.put_line(rpad(lr$row_.client,20) || rpad(lr$row_.dt,40) || lr$row_.status);
    
  END loop;
  close cursor$get_user;
END;
 
 
anonymous block completed
Elapsed: 00:00:00.012
 
Иванов              19.05.2014 12:33:31                     no
Петров              19.05.2014 12:56:29                     no
/
DROP TABLE temp_table purge;
 
TABLE TEMP_TABLE dropped.
Elapsed: 00:00:00.724
это ваше решение
0
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
20.05.2014, 16:41  [ТС] 25
mlc, да спасибо,спасибо, спасибо, но мне важно не просто сдуть ответ(хотя его наличие несомненно поднимает уверенность в сдаче лабораторной), но и разболтаться в решении.
С Этого момента реально не понимаю, что творится, хотя это чистые sql команды...
SQL
1
2
3
4
5
6
7
(
                              SELECT t.*, 
                                ROW_NUMBER()OVER(partition BY client ORDER BY dt DESC) rn,
                                COUNT(NULLIF(STATUS,'yes'))OVER(partition BY client ORDER BY dt DESC ROWS BETWEEN CURRENT ROW AND 2 following) x
                              FROM temp_table t
                            )
                            WHERE rn = 1 AND x = :1]' USING ln$limit_fail_connection;
Поэтому сейчас пробую курсору дать верную ориентацию, разбирая ваше решение.
SQL
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
 DECLARE
CURSOR c_conect_cursor
IS 
SELECT
t1.client,t1.time_call,t1.status--,t2.client
FROM CON_1 t1, (SELECT client, COUNT(*)AS who
FROM CON_1
GROUP BY client) t2
WHERE t1.client=t2.client;
v_num NUMBER(3):=&ROWCOUNT;
v_time CON_1.time_call%TYPE;
v_client CON_1.client%TYPE;
v_limit NUMBER(3):=3;
v_status CON_1.status%TYPE;
v_conect_record c_conect_cursor%ROWTYPE;
BEGIN
OPEN  c_conect_cursor;
FETCH c_conect_cursor INTO v_client, v_time, v_status;
while c_conect_cursor%found AND v_status LIKE 'no'
 
Loop
INSERT INTO  CON_2(client, time_call, STATUS)
VALUES (v_client, v_time, v_status);
FETCH c_conect_cursor INTO v_client, v_time, v_status;
END Loop;
Close  c_conect_cursor;
END;
0
25 / 25 / 10
Регистрация: 20.09.2009
Сообщений: 110
20.05.2014, 16:49 26
я вам скажу так - вы лучше разбирайтесь в том, что выполняет вышеописанный мною курсор, а не городите велосипед. То, что вы пишете - это ужасно как с точки зрения логики, так и с точки зрения производительности. Поверьте за такие решения вас никакой нормальный специалист по голове не погладит. В решение вашей текущей задачи совсем нет необходимости использовать дополнительные таблицы и прочие прелести.
0
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
20.05.2014, 16:53  [ТС] 27
ХОРОШО !!!
С доп таблицей согласна, достаточно группировки и и с остальным тоже
0
20.05.2014, 16:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2014, 16:53
Помогаю со студенческими работами здесь

Как получить список пользователей ?
Есть класс который хранить пользователей в списке private List<Person> personList = new...

Получить список активных пользователей.
Всем привет. Может и проскакивала такая тема, но не нашёл её. Интересует ответ на вопрос: Как...

Как получить список пользователей?
Доброго времени суток. Как получить список пользователей на Ubuntu сервере с помощью Java? Через...

Получить список заблокированных пользователей
Всем привет. Допустим, у меня на компьютере 3 учетные записи. Я вошел под именем "Рен", затем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru