#oracle
#Oracle
Вопрос:
Я получаю сообщение об ошибке при использовании приведенной ниже команды в SQL;
EXEC SYS.DBMS_SESSION.SLEEP(1);
Но если я использую DBMS_LOCK, тогда он работает.
EXEC SYS.DBMS_LOCK.SLEEP (1);
ссылка: https://oracle-base.com/articles/18c/dbms_session-sleep-18c
есть ли что-то, чего мне не хватает при использовании этой команды?
Комментарии:
1. Работает для меня на
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
2. Очевидный вопрос — какова ваша версия Oracle?
3. это oracle 11g (11.2)
Ответ №1:
DBMS_LOCK — это привилегированная процедура, т. Е. В ней много энергии, и поэтому она обычно была защищена от общего использования. Проблема в том, что очень полезная процедура СНА также была недоступна.
В 18c мы осознали эту проблему и поэтому реплицировали процедуру ожидания в DBMS_SESSION, которая является общедоступной. Таким образом, каждый может использовать SLEEP.
До 18c вам необходимо предоставить execute для DBMS_LOCK тем, кто этого хочет (что рискованно), или создать функцию-оболочку и предоставить только это, например
create or replace
procedure SYS.SLEEP(n number) is
begin
dbms_lock.sleep(n);
end;
grant execute on sys.sleep to public;
Комментарии:
1. Это не всегда решение.
2. Не могли бы вы объяснить?
3. Я не могу выбрать версию, и я работаю в 12c. Я выполняю процесс, который фиксирует выполнение в таблице журнала. Я использую переменную SYSDATE, и для тестирования процедуры мне нужна команда SLEEP . Итак, компания, в которой я работаю, останется в 12c, и единственным решением, которое я нашел, было: выполнить каждый оператор типа: PR_LOG(MY_TABLE, MY_STEP, OK, ERROR, N_ROWS) в scripts.sql. Наконец, мне нужно использовать функцию sleep 5 в Linux, чтобы увидеть приращение. В моем случае я ничего не могу сделать с версией или предоставить привилегии.
4. Да, но прочитайте мой ответ еще раз. Я дал вам решение 18c И явное решение for для всех баз данных до 18c.
5. Прочитайте вопрос, в котором нет вашей спецификации.
Ответ №2:
Самодельная процедура. Если у вас нет права устанавливать разрешение
CREATE OR REPLACE procedure new_sleep(p_nSekunden number)
is
dDate date := sysdate;
begin
dDate := dDate ( (1/24/3600) * p_nSekunden );
loop
exit when sysdate > dDate;
end loop;
end;