идентификатор ‘SYS.DBMS_SQL’ должен быть объявлен ошибкой

#oracle #plsql

#Oracle #plsql

Вопрос:

Ниже приведено тело моего пакета. Но получение идентификатора ‘SYS.DBMS_SQL’ должно быть объявлено ошибкой, а ‘SYS.DBMS_LOB’ должно быть объявлено ошибкой.Я использую глобальную временную таблицу для вставки в нее данных, а затем использую ее для удаления записей из таблицы.

  procedure del_cop (p_in_del_cri_mos in number,
                     p_out_err_msg    out varchar2,
                     p_dop            in number default 1
                    ) is
  begin
    if  xxau_house_keep_globals.g_batch_id is null
    then
        xxau_house_keep_globals.g_batch_id := xxau_housekeeplog_batch_id_seq.nextval;
    end if;
execute immediate 'truncate table to_del_cnf_pye_bse_gtt';
insert into to_del_cnf_pye_bse_gtt (fap_inr_idr, cpb_rowid)
      select cpb.fap_inr_idr,
             cpb.rowid
      from   to_cnf_pye_bse_test cpb
      where  cpb.lod_tmp < (systimestamp - numtoyminterval(nvl(p_in_del_cri_mos,15), 'MONTH'));
commit;
delete from to_cop_msg_aud_test
    where fap_inr_idr in (select fap_inr_idr from to_del_cnf_pye_bse_gtt gtt);
commit;
exception
    when others then
      rollback;
end del_cop;
 

Комментарии:

1. Пакеты DBMS_SQL и DBMS_LOB являются базовыми пакетами на сервере Oracle. Без этих пакетов ваша база данных вообще не работает. По умолчанию привилегия на ВЫПОЛНЕНИЕ предоставляется PUBLIC.

2. Ваш код не содержит никаких DBMS_SQL , но, как уже упоминалось, это базовый пакет и используется внутри других функций. Вы «играли» со своей базой данных, выведя ее из строя?

Ответ №1:

Вам не хватает привилегий для этих пакетов. Позвольте SYS предоставить EXECUTE привилегии непосредственно вам (не через роль), потому что такие привилегии не будут работать в именованных процедурах PL / SQL (а у вас именованная процедура, не так ли? Его имя del_cop является частью (также именованного) пакета).

Комментарии:

1. Но по какой причине или части моего кода он обращается к этим пакетам?

2. Эта часть нет. Но, как вы сказали, это часть пакета . Вы не можете скомпилировать его, если что-то не так и, по-видимому, есть.

3. Пакет выполнен, и в нем нет ничего, кроме этой процедуры. Я получаю эту ошибку во время выполнения процедуры

4. ОК. Короче говоря: предоставляли ли вы (или нет) привилегии непосредственно пользователю, который выполняет эту процедуру?

5. Пакеты DBMS_SQL и DBMS_LOB являются одними из самых (!) базовых пакетов, по умолчанию привилегия EXECUTE предоставляется PUBLIC.