Я пытаюсь удалить список процедур после того, как Все этих процедур выполнены успешно. Таким образом, если какая-либо из процедур не удалась, ее можно отладить без потери.Удаление списка процедур
Однако я получаю ORA-04021: тайм-аут произошел во время ожидания блокировки объекта
Вот код.
Пакет функция: тело
create or replace package remove_procedures AUTHID CURRENT_USER is
procedure dropProcedures(p_schema varchar2, p_type varchar2, p_object_list varchar2);
procedure dropProceduresName(p_schema varchar2, p_object_list varchar2);
end remove_procedures;
Пакета:
create or replace package body remove_procedures is
-- type declaration for a collection of string
type t_stringtab is table of varchar2(100);
function listToTab (p_list in varchar2)
return t_stringtab is
l_str varchar2(32760) default p_list ||',';
l_n number;
l_retval t_stringtab := t_stringtab();
l_item varchar2(100);
begin
-- traverse the items in the comma seperated list into a nested table
loop
-- find the position of the first comma in l_str
l_n := instr(l_str, ',');
-- exit the loop if a comma was not found
exit when (nvl(l_n,0) = 0);
-- add an element to our collection to hold the next item parsed from the string
l_retval.extend;
-- parse the next item from the comma seperated string
l_item := ltrim(rtrim(substr(l_str,1,l_n-1)));
-- raise an exception if the length of the item exceeds 30 bytes (limit for oracle object names)
-- todo - add check for violations of other naming rules e.g. items beginning with a number
/* if lengthb(l_item) > 30 then
raise_application_error(-20000,'Error : 30 bytes limit exceeded for item : '|| l_item); --disabling this block for file names
end if; */
-- otherwise add the item to the element in the collection
l_retval(l_retval.count) := l_item;
-- reset l_str variable to the remainder of the comma seperated list
l_str := substr(l_str, l_n+1);
end loop;
return l_retval;
end listToTab;
procedure dropProcedures(p_schema varchar2, p_type varchar2, p_object_list varchar2) is
l_objects t_stringtab := t_stringtab();
l_object_found number;
begin
l_objects := listToTab(p_object_list);
for i in l_objects.first .. l_objects.last loop
select count(*) into l_object_found
from user_objects
where upper(object_type) = upper(p_type)
and upper(object_name) = upper(l_objects(i));
if l_object_found = 0 then
dbms_output.put_line('WARNING : Object '||upper(p_schema)||'.'||upper(l_objects(i))||' does not exist.');
else
dbms_output.put_line('Dropping Object '||upper(p_type)||' named '||upper(p_schema)||'.'||upper(l_objects(i))||' now...');
begin
execute immediate 'drop '||p_type||' '||upper(p_schema)||'.'||upper(l_objects(i));
exception when others then
if sqlcode = -00942 then
null;
else
raise;
end if;
end;
end if;
end loop;
end;
Тогда вот код для выполнения всех процедур, и если все процедуры выполняются, то падение нескольких процедур.
create or replace procedure ref_master is
begin
ref_categories;
ref_country;
ref_currency;
ref_currency_to_country;
promotions.remove_procedures.dropProcedures(
p_schema => 'PROMOTIONS',
p_type => 'PROCEDURE',
p_object_list => 'ref_country,ref_currency,ref_currency_to_country');
end;
А вот исполнение ref_master, и это, где я получаю ошибку упоминалось ранее:
begin
-- Call the procedure
ref_master;
end;
Удивительно, но когда я запускаю только определенные строки, то он работает котировка нормально:
begin
promotions.remove_procedures.dropProcedures(
p_schema => 'PROMOTIONS',
p_type => 'PROCEDURE',
p_object_list => 'ref_country,ref_currency,ref_currency_to_country');
end;
Любые идеи о том, как я могу продолжить, я смогу отказаться от процедур, если все выполнено успешно, или немедленно прекратить работу, если какая-либо из процедур не была выполнена должным образом. Заранее спасибо :-)
Почему вы хотите отказаться от процедур после их запуска? Процедуры не должны быть одноразовыми, – APC
Да, но клиент говорит, что они склонны изменять процедуры, поэтому, если указанные процедуры в списке не отброшены, в будущем может быть много устаревших процедур. – Jaanna
По-прежнему звучит неправильно. Почему «изменение» означает «падение»? Почему бы не «создать или заменить»? – APC