Принудительное завершение сеансов Oracle (ALTER SYSTEM KILL SESSION)



Скрипт выборки зависших сеансов. Значения подставляйте, те которые Вам необходимы. В моем случае небольшое ограничение по времени и сессии всех пользователей кроме пользователя SYS.

SELECT v.SID, v.SERIAL# serial, w.SECONDS_IN_WAIT 
     FROM v$session_wait w, v$session v
     WHERE v.STATUS IN ('ACTIVE')
     AND nvl(v.SCHEMANAME,'xx')!='SYS'
     AND v.LAST_CALL_ET > 3600
     AND w.SECONDS_IN_WAIT > 115500
     AND w.SID = v.sid;

Завершить сеансы можно SQL предложением ALTER SYSTEM KILL SESSION.
Полученные значения SID и SERIAL# указываются в SQL предложении:

ALTER SYSTEM KILL SESSION 'sid,serial#';

Например, для завершения сеанса пользователя TEST1 SQL предложение будет выглядеть так:

ALTER SYSTEM KILL SESSION '671, 26498';

В некоторых ситуациях процесс oracle не может быть завершен немедленно. В таких случаях сеанс помечается на прерывание. И будет уничтожен, как только будет возможно.

ALTER SYSTEM KILL SESSION является самым безопасным способом прекращения сеанса Oracle.
В oracle есть возможность завершить сеанс форсировано, добавлением ключевого слова IMMEDIATE:

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

Например, для завершения сеанса пользователя TEST1 из вышеприведенного примера, команда будет выглядеть так:

ALTER SYSTEM KILL SESSION '671, 26498' IMMEDIATE;

Автоинкрементное поле в Oracle



В СУБД Oracle отсутствует такое понятия как “автоинкрементное поле”, для создания уникального значения поля используется последовательность SEQUENCE.

CREATE sequence sq_test;

Следующее последовательное уникальное значение может быть получено напрямую или через триггер.

CREATE TABLE test (
test_id number(38)
, code varchar2(16)
, constraint pk_test PRIMARY KEY (test_id)
);
 
CREATE OR REPLACE TRIGGER tbiur_test
before INSERT OR UPDATE ON test
FOR each row
begin
IF :new.test_id IS NULL then
SELECT sq_test.NEXTVAL INTO :new.test_id FROM dual;
end IF;
end;
/
-- Прямое использование последовательности
INSERT INTO test (test_id, code) VALUES (sq_test.NEXTVAL, 'One');
-- Нахождение значения первичного ключа в триггере.
INSERT INTO test (code) VALUES ('Two');
INSERT INTO test (test_id, code) VALUES (NULL, 'Three');

Дополнительно: получение значения поля (любого, не только ключевого и/или сгенеренного из последовательности) после добавления одиночной записи (через INSERT INTO .. VALUES) через RETURN[ING]. (VAR – команда для SQL*Plus, деклалирующая переменную test_id)

var test_id number
INSERT INTO test (test_id, code) VALUES (sq_test.NEXTVAL, 'One') RETURN test_id INTO :test_id;
INSERT INTO test (code) VALUES ('Two') RETURN test_id INTO :test_id;

При использовании конструкции INSERT INTO .. SELECT опция RETURN[ING] недоступна.