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