Как отлавливать ошибки в функции postgresql, если использовать запрос union внутри, чтобы узнать, какая часть union выдала ошибку - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь создать функцию тестирования, которую я буду интегрировать с кругом CI.Идея состоит в том, чтобы создать 1 основную тестовую функцию, которая будет выполнять ряд базовых функций с параметром и показывать результат, который был пройден, а какой отказал.

В настоящее время у меня есть прототип функции, который вызывает 3 функции и тестирует их.Согласно моей логике, я вижу, что результат прошел / не прошел, если основная функция не возвращает никаких данных.Но когда есть синтаксическая ошибка в базовых функциях, она просто показывает, какая ошибка в соответствии с моей логикой, потому что я перехватываю исключение, но не показывает, из какой функции произошла ошибка.

Вот мой прототип тестовой функции:

RETURNS table (function text, result text) AS $$
  DECLARE cnt  INTEGER;
BEGIN

    return query

    select 'org.fn_get_org_hierarchy_full'::text as function,
           case when count(*) > 0 then 'pass'::text else 'fail'::text end as result
    from org.fn_get_org_hierarchy_full(array['828a5368-c27b-4cf4-41bb-25eed0f50420'])

    UNION

    select 'assessment.fn_get_activity_summary'::text as function,
           case when count(*) > 0 then 'pass'::text else 'fail'::text end as result
    from assessment.fn_get_activity_summary('9144de83-e18e-9c8a-0051-b13eb4227d42', -- root_org_sk
                                            ARRAY ['40b4ae2c-aec7-c27c-7a39-616055d8c174'],
                                            ARRAY ['359f3a32-6ba5-a366-028a-df8c274f650c'],
                                             array['ND'], -- learner_sk
                                             ARRAY['ND'], -- status
                                             Array['ND'],
                                             ARRAY['ND'],
                                             ARRAY['ND'],
                                            '1900-01-01 00:00:00.000000',
                                            '2999-01-01 00:00:00.000000',
                                              10000,0,
                                            array['ND']
                                            )

    UNION

     select 'assessment.fn_get_activity_details'::text as function,
           case when count(*) > 0 then 'pass'::text else 'fail'::text end as result
    from assessment.fn_get_activity_details('9144de83-e18e-9c8a-0051-b13eb4227d42',     
                                              array['40b4ae2c-aec7-c27c-7a39-616055d8c174'],  
                                              array['359f3a32-6ba5-a366-028a-df8c274f650c'],  
                                              array['ND'],  -- learner
                                              array['c9f84884-348e-5388-6e5e-4321526410d0'],  
                                              array['ND'],  -- assessment_sk
                                              array['ND'],  -- cls_term
                                              array['ND'],  -- cls_sys
                                              array['ND'],  -- assigned_item_status
                                              array['assessment'],  -- assignment_type_name
                                              '1900-01-01 00:00:00.000', -- min_student_start_datetime
                                              '2999-01-01 00:00:00.000', -- max_student_stop_datetime,
                                            10000,0,
                                            array['ND']
                                            );


exception when others then

    raise notice 'Function Failed';

    raise notice '% % ', SQLERRM, SQLSTATE;



END $$ LANGUAGE plpgsql;

Я настроил его со всеми параметрами, необходимыми для функции функции.

Вот как я вижу вывод:

enter image description here

Если функция не возвращает данные, то перед ней возникает сбой, которыйчто я хочу.

Но если есть синтаксическая ошибка, я вижу вывод следующим образом: enter image description here

Есть ли способ показать вывод в точно таком же формате, как этотдаже если синтаксическая ошибка.Я имею в виду, я хочу увидеть сбой перед функцией, которая имеет синтаксическую ошибку.Я полагаю, мне понадобится какой-нибудь механизм try-catch для каждой части объединения, которая у меня есть.Как я могу лучше подойти к этому?Или есть способ сделать это в postgresql.

1 Ответ

0 голосов
/ 09 апреля 2019

Обновление: Я нашел способ сделать это так: дайте мне знать, если какой-либо другой эффективный способ:

RETURNS table (function text, result text) AS $$
  DECLARE cnt  INTEGER;
BEGIN


    begin
    return query

    select 'org.fn_get_org_hierarchy_full'::text as function,
           case when count(*) > 0 then 'pass'::text else 'fail'::text end as result
    from org.fn_get_org_hierarchy_full(array['828a5368-c27b-4cf4-41bb-25eed0f50420']);


    exception when others then

    raise notice 'Error  : org.fn_get_org_hierarchy_full failed';

    raise notice '% % ', SQLERRM, SQLSTATE;

    End;


    BEGIN

    return query
    select 'assessment.fn_get_activity_summary'::text as function,
           case when count(*) > 0 then 'pass'::text else 'fail'::text end as result
    from assessment.fn_get_activity_summary('9144de83-e18e-9c8a-0051-b13eb4227d42', -- root_org_sk
                                            ARRAY ['40b4ae2c-aec7-c27c-7a39-616055d8c174'],
                                            ARRAY ['359f3a32-6ba5-a366-028a-df8c274f650c'],
                                             array['ND'], -- learner_sk
                                             ARRAY['ND'], -- status
                                             Array['ND'],
                                             ARRAY['ND'],
                                             ARRAY['ND'],
                                            '1900-01-01 00:00:00.000000',
                                            '2999-01-01 00:00:00.000000',
                                              10000,0,
                                            array['ND']
                                            );


    exception when others then

    raise notice 'Error : assessment.fn_get_activity_summary Failed';

    raise notice '% % ', SQLERRM, SQLSTATE;
   end;
END $$ LANGUAGE plpgsql;

Каждый запрос имеет свой отдельный блок begin и end. и поймать исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...