Advertisement
thiemo-kellner

Problem with 'get current diagnostics'

Sep 21st, 2019
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. create or replace function EXECUTE_WO_RETURN_LOGGED(
  2.     I_STATEMENT_TO_EXECUTE  in  text,
  3.     I_LEVEL                 in  text        default 'LOG',
  4.     I_REPORT_ERRORS_ONLY    in  boolean     default false
  5. )
  6.   returns bigint
  7.   language plpgsql
  8.   security invoker
  9.   volatile
  10.   set search_path = --current user,
  11.                     :SCHEMA_NAME_LOGGER,
  12.                     :SCHEMA_NAME,
  13.                     :SCHEMA_NAME_UTILS,
  14.                     public
  15.   as
  16. $body$
  17.     declare
  18.         -- Constants
  19.         C_LB                constant            varchar(2) default e'\n';
  20.  
  21.         -- Variables
  22.         V_TEXT                                  text;
  23.         V_REC                                   record;
  24.         V_ROW_COUNT                             bigint
  25.           default 0;
  26.         V_EXCEPTION_OCCURRED                    boolean
  27.           default false;
  28.         V_SQLSTATE                              char(5);
  29.         V_STACK                                 text
  30.           default '!!!no data found!!!';
  31.         V_DETAILS                               text
  32.           default '!!!no data found!!!';
  33.         V_HINT                                  text
  34.           default '!!!no data found!!!';
  35.     begin
  36.         execute I_STATEMENT_TO_EXECUTE;
  37.         get current diagnostics V_ROW_COUNT = ROW_COUNT;
  38.         V_TEXT :=
  39.           'Following statement has been executed successfully affecting ';
  40.         case V_ROW_COUNT
  41.             when 0 then
  42.                 V_TEXT := V_TEXT || ' no row.';
  43.             when 1 then
  44.                 V_TEXT := V_TEXT || ROW_COUNT || ' row.';
  45.             else
  46.                 V_TEXT := V_TEXT || ROW_COUNT || ' rows.';
  47.         end case;
  48.         V_TEXT := V_TEXT || C_LB || C_LB || '-- Statement' || C_LB ||
  49.           I_STATEMENT_TO_EXECUTE;
  50.         case I_LEVEL
  51.             when 'DEBUG' then
  52.                 perform DEBUG(I_MESSAGE => V_TEXT) ;
  53.             when 'LOG' then
  54.                 perform LOG(I_MESSAGE => V_TEXT) ;
  55.             when 'INFO' then
  56.                 perform INFO(I_MESSAGE => V_TEXT) ;
  57.             when 'NOTICE' then
  58.                 perform NOTICE(I_MESSAGE => V_TEXT) ;
  59.             when 'WARNING' then
  60.                 perform WARNING(I_MESSAGE => V_TEXT) ;
  61.             when 'EXCEPTION' then   -- maybe pointless but there you go ;-)
  62.                 perform EXCEPTION(I_MESSAGE => V_TEXT) ;
  63.             else
  64.                 raise exception '%', 'Unsupported level ' || I_LEVEL;
  65.         end case;
  66.         return V_ROW_COUNT;
  67.      exception
  68.         when others then
  69.             if I_REPORT_ERRORS_ONLY then
  70.                 get stacked diagnostics V_DETAILS = PG_EXCEPTION_DETAIL;
  71.                 get stacked diagnostics V_HINT = PG_EXCEPTION_HINT;
  72.                 get stacked diagnostics V_STACK = PG_EXCEPTION_CONTEXT;
  73.                 perform WARNING(
  74.                     I_MESSAGE       => GET_FORMATTED_EXCEPTION_MESSAGE(
  75.                                            I_STATEMENT_WITH_PARAMETERS  =>
  76.                                              I_STATEMENT_TO_EXECUTE,
  77.                                            I_SQLSTATE                   =>
  78.                                              SQLSTATE,
  79.                                            I_SQLERRM                    =>
  80.                                              SQLERRM,
  81.                                            I_DETAILS                    =>
  82.                                              V_DETAILS,
  83.                                            I_HINT                       =>
  84.                                              V_HINT,
  85.                                            I_STACK                      =>
  86.                                              V_STACK
  87.                                        )
  88.                 );
  89.                 return null;
  90.             else
  91.                 raise;
  92.             end if;
  93.     end;
  94. $body$;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement