2011-02-07 3 views
2

Быстрый и простой вопрос:Возврат ошибок из PL/SQL

Я пишу хранимую процедуру PL/SQL. Он содержит некоторые вызовы execute immediate, которые могут выйти из строя. Я не хочу поднимать ошибку. Я хочу, чтобы хранимая процедура завершила свое выполнение и вернула список ошибок. Что-то вроде:

for vRecord in vCursor 
loop 
    begin 
     execute immediate 'insert into t(a) values (' || vRecord.val || ')'; 
    when others then 
     -- store the error somewhere to return it!! 
    end; 
end loop; 

Так что мой вопрос: какой рекомендуемый способ вернуть эти ошибки? Стол? Параметр out?

Большое спасибо.

ответ

3

Вау, я просто ответил на аналогичный вопрос в другой теме, странный день. Используйте таблицу LOG и использовать автономные транзакции, если вы просто хотите ошибки (или сообщения) Журнал:

См here

+0

Спасибо! Я подумал об этом. Не знаю, если это лучший вариант. Кажется, что OVERKILL использует ТАБЛИЦУ только для того, чтобы возвращать ошибки ... Спасибо за предложение в любом случае! –

+0

Никогда не переполняйте ошибки журнала, передовую практику;) И у вас есть контрольный журнал того, что происходит со временем, предполагая, что это то, что вы будете запускать на некоторой частоте. – tbone

+0

Вы действительно должны использовать что-то вроде dbms_utility.format_error_stack || dbms_utility.format_error_backtrace, а не только SQLERRM. –

3

С версии 10g Release 2 года, вы можете использовать DML протоколирования ошибок хранить все ошибки в специальном Таблица. Вы можете прочитать об этом здесь:

http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_errlog.htm#ARPLS680

Некоторые другие рекомендации, основанные на коде, публикуемую:

1) Это не обязательно использовать динамический SQL здесь. Просто используйте это вместо:

insert into t(a) values (vRecord.val); 

2) Здесь нет необходимости использовать петлю. Просто используйте INSERT/SELECT вместо:

insert into t(a) select [the query from your vCursor here] 

С уважением,
Роб.

+0

Большое спасибо за ответ Роб. Я рассмотрю журнал ошибок DML. Спасибо за ваши предложения. Но то, что я написал, - всего лишь пример кода. Мой фактический код ** требует ** динамического SQL. –

+0

Это всегда лучшая идея использовать встроенные функции Oracle, а не сворачивать наши собственные. Тем не менее, я не уверен, насколько легко будет использовать регистрацию ошибок DML с динамическим SQL; это зависит от того, каким образом SQL является динамическим ... – APC

+0

True. Таблица - t в этом случае - не должна быть динамичной :-) –