PLS-00302: компонент ‘SLEEP’ должен быть объявлен

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