Как выйти из основной функции, если дочерняя функция не работает - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть основная функция, например, ниже, которая вызывает дочерние функции, как показано ниже.

Как полностью выйти из мастер-функции при сбое одной из дочерних функций?

CREATE OR REPLACE FUNCTION process_hide(
    IN p_hide_date character varying,
    IN p_hidedatexml character varying,
    IN p_cmp integer,
    IN p_taxin_no character varying)  RETURNS VOID AS $$

BEGIN
    PERFORM fn_hide_location(p_hide_date,p_cmp,p_taxin_no);
    PERFORM fn_hide_swlist(p_hide_date,p_cmp,p_taxin_no);
    PERFORM fn_hide_swruns(p_hidedatexml,p_cmp,p_taxin_no);
    PERFORM fn_hide_swdudes(p_hide_date,p_cmp,p_taxin_no);
    PERFORM fn_hide_chapter(p_hide_date,p_cmp,p_taxin_no);
 END;
$$ LANGUAGE plpgsql
COST 100;

Дочерние функции, вызываемые внутри "мастер-функции", по существу выполняют следующее

  1. У меня есть список идентификаторов из другого источника, который подается во временную таблицу
  2. Затем существующие записи должны быть помечены определенным значением, скажем «hideme», которое соответствует идентификаторам ввременная таблица.
  3. У меня есть другая таблица, в которой есть счет до и после обновления.
  4. Я записываю в эту таблицу подсчет всех записей до обновления и после обновления.
  5. если количество не совпадает, выйдите из функции

1 Ответ

0 голосов
/ 08 ноября 2019

Как отмечали другие, вы можете выдать / вызвать ошибку / исключение в других функциях

Raise Exception 'the Counts do not match first count %, second count %', count1, count2

Это имеет недостаток отката всей выполненной работы, которую вы, возможно, не захотите

Если вы не хотите откатывать выполненную работу, вы можете изменить функции на Процедуру, которая позволяет фиксировать записи и по-прежнему вызывать исключения Процедура создания должна использовать версию 11 или выше

Другаяопция - это возвращаемые данные из начинающих функций и решение, что делать оттуда

CREATE OR REPLACE FUNCTION return_process(int, int) returns  int as $$
begin
--do some record processing
return 1;
end;
$$

CREATE OR REPLACE FUNCTION master_process(int, int) returns  int as $$
declare
_result int ;
begin
select return_process(1,2) into _result;
end;
$$
...