Вернуть REF CURSOR в процедуру сгенерированных данных - PullRequest
0 голосов
/ 04 января 2011

Мне нужно написать sproc, который выполняет некоторые INSERT для таблицы, и скомпилировать список «состояний» для каждой строки, основываясь на том, насколько успешно прошла INSERT.Каждая строка будет вставлена ​​в цикл, цикл перебирает курсор, который предоставляет некоторые значения для оператора INSERT.Мне нужно вернуть набор результатов, который выглядит следующим образом:

FIELDS_FROM_ROW_BEING_INSERTED.., STATUS VARCHAR2

СОСТОЯНИЕ определяется тем, как прошла INSERT.Например, если INSERT вызвал исключение DUP_VAL_ON_INDEX, указывающее на наличие дублирующейся строки, я бы установил для STATUS значение «Dupe».Если бы все прошло хорошо, я бы установил «УСПЕХ» и перешел бы к следующей строке.

К концу всего этого у меня будет результирующий набор из N строк, где N - это числовыполняются операторы вставки, и каждая строка содержит некоторую идентифицирующую информацию для вставляемой строки вместе с «STATUS» вставки

Поскольку в моей БД нет таблицы для хранения значений, которые я хотел бы передать обратнопользователю, мне интересно, как я могу вернуть информацию обратно?Временный стол?Кажется, в Oracle временные таблицы являются «глобальными», не уверен, что мне нужна глобальная таблица. Есть ли временные таблицы, которые удаляются после завершения сеанса?

Ответы [ 2 ]

2 голосов
/ 04 января 2011

Если вы используете Oracle 10gR2 или новее, вам следует проверить ведение журнала ошибок DML.Это в основном делает то, что вы хотите достичь, то есть позволяет нам выполнять все DML в пакетном процессе, записывая любые ошибки и нажимая на операторы.

Принцип заключается в том, что мы создаем ЖУРНАЛ ОШИБКИтаблица для каждой таблицы, с которой нам нужно работать, используя встроенный в PL / SQL пакет DBMS_ERRLOG. Узнайте больше .Существует простое расширение синтаксиса DML для регистрации сообщений в таблице журнала ошибок. См. Пример здесь .Этот подход не создает больше объектов, чем ваше предложение, и имеет преимущество использования некоторой стандартной функциональности Oracle.

При работе с массовой обработкой (то есть при использовании синтаксиса FORALL) мы можем перехватывать исключения, используявстроенная коллекция SQL% BULK_EXCEPTIONS. Проверьте это .Можно объединить групповые исключения с ведением журнала ошибок DML, но это может создать проблемы в 11g. Узнайте больше.

1 голос
/ 04 января 2011

«Глобальные» в случае временных таблиц означают, что они являются постоянными, а данные являются временными.

Я бы определил тип записи, соответствующий вашему курсору, плюс поле состояния. Затем определите таблицу этого типа.

TYPE t_record IS
(
    field_1,
    ...
    field_n,
    status VARCHAR2(30)
);

TYPE t_table IS TABLE OF t_record;

FUNCTION insert_records
(
    p_rows_to_insert IN SYS_REFCURSOR
)
    RETURN t_table;

Еще лучше было бы также определить входные данные как тип таблицы вместо курсора.

...