Старый 25.01.2012, 13:48   #1   
Бывалый форумец
 
Аватар для J++
 
Сообщений: 687
Регистрация: 05.08.2005

J++ вне форума Не в сети
Ораклисты, help pls

Пишу процедуру на PL/SQL Оракла.
пока в них не сильна, нужен совет в расстановке commit-rollback внутри процедуры:

сейчас сделано примерно так (если писать человеческим языком):

Код:
PROCEDURE какая-то (список параметров)
IS
BEGIN
 
  IF проверка_1_не_прошла THEN
       RETURN;
  END IF;


  IF проверка_2_не_прошла THEN
       RETURN;
  END IF;

  все_проверки_прошли_что-то_делаем_с записью_в_базу;
  commit; 

EXCEPTION -- отловить всякую бяку, которая не предусмотрена процедурой и предыдущими блоками begin-end
     WHEN OTHERS THEN
        -- тут_присвоить_коды_ошибок_выходным_переменным и т.п.
        an_err_code:=SQLCODE;
        as_err_text:=SQLERRM;            

        rollback;
END;
при этом внутри процедуры могут быть вложенные блоки
BEGIN-EXCEPTION-END, которые обрабатывают только "нужные" исключения, а WHEN OTHERS оставляют самому внешнему блоку.

вопрос:

1) правильно ли я поставила rollback в обработке самого внешнего Exception?
Теоретически, мимо него не должна проскочить никакая нештатная сиуация - а все штатные exception-ы обрабатываются раньше, в проверках и блоках IF.

2) мне обязательно нужно возвращать коды ошибок Oracle, если хоть что-то произошло.

Вот в этой ситуации коды ошибок присваиваются выходным переменным:
Код:
        -- тут_присвоить_коды_ошибок_выходным_переменным и т.п.
        an_err_code:=SQLCODE;
        as_err_text:=SQLERRM;            

        rollback;
а в этой что? может ли rollback пере-инициализировать коды ошибок Oracle?
и следовательно, если rollback идет первым - то увижу не реальную ошибку, из-за которой случился exception, а код завершения операции rollback?

Код:
        rollback;

        -- тут_присвоить_коды_ошибок_выходным_переменным и т.п.
        an_err_code:=SQLCODE;
        as_err_text:=SQLERRM;
Может кто-нибудь увидит другие некорректные вещи, - тогда тоже скажите плз.
  Ответить с цитированием
Старый 26.01.2012, 09:40   #2   
Бывалый форумец
 
Аватар для J++
 
Сообщений: 687
Регистрация: 05.08.2005

J++ вне форума Не в сети
Знаю, что плохо делать rollback-commit внутри процедуры. Но я крутила-крутила варианты, всё равно получается программный код так себе. Не лапша, но явно и не дзен.

Если не понравится, сделаю то же самое на уровне вызывающих.

А исключения В ДАННОМ случае и не нужно передавать никуда наверх. Там пока что достаточно кодов ошибок. Это все - довольно тупая либа, которая работает по принципу "получилось - не получилось". Если она получит развитие, то буду смотреть дальше.

В общем, я так понимаю - нехорошо, но не криминально? Если так, то пока оставлю этот вариант.

Последний раз редактировалось J++; 26.01.2012 в 12:38.
  Ответить с цитированием
Старый 26.01.2012, 21:46   #3   
Форумец
 
Аватар для n0frost
 
Сообщений: 50
Регистрация: 19.11.2009
Возраст: 48

n0frost вне форума Не в сети
Цитата:
Сообщение от Ismail Посмотреть сообщение
Фиксация-откат внутри функций - плохо. Обработка всех исключений без передачи ошибки наверх - плохо.
Эт точно, еще много ретурнов из разных мест - тоже плохо.

Я обычно в похожих случаях делаю функцию, возвращает 0 - значит саксесс, иначе код ошибки.
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind