Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

Показаны сообщения с ярлыком sql. Показать все сообщения
Показаны сообщения с ярлыком sql. Показать все сообщения

вторник, 7 июля 2009 г.

Удаление сессий в Oracle

Время от времени нам требуется создавать заново схему БД - это делается во время ночных билдов (nightly builds) в КруизКонтроле. Это, однако, невозможно, если остаются пользователи, подключенные в БД. Поэтому для создания схемы надо убить все сессии.

Приведенная ниже процедура убивает все сессии в Oracle:

CREATE OR REPLACE PROCEDURE Kill_User_Sessions(Usernames IN VARCHAR2)
AUTHID CURRENT_USER
IS
Stmt_Str VARCHAR2(200);
Sid_V VARCHAR2(30);
SerialNum_V VARCHAR2(30);
CURSOR pri IS
SELECT Sid, Serial#, Username
FROM v$session
WHERE Username IS NOT NULL
AND Username IN (Usernames)
AND Status NOT IN ('KILLED','SNIPED');
BEGIN
FOR usr IN pri
LOOP
Sid_V := usr.Sid;
SerialNum_V := Usr.Serial#;
Stmt_Str := 'ALTER SYSTEM KILL SESSION ''' || Sid_V || ',' || SerialNum_V || '''';
EXECUTE IMMEDIATE(stmt_str);
END LOOP;
END;

Она используется следующим образом:

CALL Kill_User_Sessions('username');

- где username - имя пользователя, сессии которого следует удалить.

Обратите внимание также на строчку AUTHID CURRENT_USER. Если задана опция AUTHID CURRENT_USER, то учитываются привилегии, данные через роль. Если не задана - т.е. по умолчанию DEFINER, то роли не учитываются.

понедельник, 15 июня 2009 г.

Получение простых чисел (prime numbers) в SQL

Просто забавная задачка на SQL: дана табличка с единственным полем (тип INT), содержащее числа от 1 до (допустим) 100. Требуется одним SQL-запросом вывести все простые числа из этой таблицы. Решение приведено для MySQL. Адаптировать его для других СУБД - без проблем.

Скрипт,создающий и заполняющий таблицу:




DROP TABLE IF EXISTS pnum;
CREATE TABLE pnum (
num int(11) NOT NULL
) ENGINE=HEAP;

DROP PROCEDURE IF EXISTS InsertNumbers;

DELIMITER |

CREATE PROCEDURE InsertNumbers(IN LMT INT)
BEGIN
DECLARE CNT INT;
SET CNT = 1;
WHILE CNT <= LMT DO
INSERT INTO pnum VALUES (CNT);
SET CNT = CNT + 1;
END WHILE;
END;

DELIMITER ;

CALL InsertNumbers(100);



Запрос, выводящий все простые числа:




SELECT p1.num FROM pnum p1
WHERE NOT EXISTS
(SELECT p2.num FROM pnum p2
WHERE p2.num < p1.num AND p2.num > 1 AND p1.num % p2.num = 0);

Постоянные читатели