Возврат количества вставок из нескольких таблиц с использованием функции postgres - PullRequest
1 голос
/ 27 февраля 2020

У меня есть функция, которая вставляет данные за 1 месяц из основных таблиц в таблицы истории. Поскольку postgres не имеет хранимой процедуры, я объявил вставку и удаление logi c как функцию. Я хочу знать, есть ли способ вернуть счетчик от вставок и удаляет в качестве вывода функции. Ниже приведен код.

CREATE FUNCTION public.insertDelete(integer)
    RETURNS void
    LANGUAGE plpgsql

AS $BODY$

DECLARE
    saveTime timestamp;
BEGIN
   saveTime := now();


INSERT INTO public.hist_One
    (select * from public.main_One
    WHERE udate < (saveTime - ($1::text || ' months')::interval));

INSERT INTO public.hist_Two
    (select * from public.main_Two
    WHERE udate < (saveTime - ($1::text || ' months')::interval));

INSERT INTO public.hist_Three
    (select * from public.main_Three
    WHERE udate < (saveTime - ($1::text || ' months')::interval));


delete from public.main_One
where udate < (saveTime - ($1::text || ' months')::interval);

delete from public.main_Two
where udate < (saveTime - ($1::text || ' months')::interval);

delete from public.main_Three
where udate < (saveTime - ($1::text || ' months')::interval);


END;
$BODY$;

Если я попытаюсь вернуть Query, то код будет выглядеть примерно так

CREATE FUNCTION public.insertDelete(integer)
        RETURNS Table(Hist_One int, Main_one int)
        LANGUAGE plpgsql

    AS $BODY$

    DECLARE
        saveTime timestamp;
    BEGIN
       saveTime := now();


    INSERT INTO public.hist_One
        (select * from public.main_One
        WHERE udate < (saveTime - ($1::text || ' months')::interval));

   RETURN QUERY select count(*) from public.main_One
        WHERE udate < (saveTime - ($1::text || ' months')::interval)

Однако проблема в том, что я хочу вернуться для всех таблиц и с RETURN QUERY Я могу сделать это только для одного стола. Итак, как я могу вернуть таблицу, в которой будут перечислены вставки в таблицы Hist и удаления из основных таблиц?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вы можете использовать диагностику ROW_COUNT, чтобы получить количество строк, на которые воздействует каждая вставка, а затем просто изменить тип возвращаемого значения функции на целое и «вернуть» общее количество строк:

CREATE FUNCTION public.insertDelete(integer)
    RETURNS integer
    LANGUAGE plpgsql
AS $BODY$
DECLARE
    saveTime timestamp;
    rowcount integer;
    totalrow integer;
BEGIN
   saveTime := now();
   total_rows := 0;

  INSERT INTO public.hist_One
    (select * from public.main_One
    WHERE udate < (saveTime - ($1::text || ' months')::interval));

  GET DIAGNOSTICS rowcount = ROW_COUNT;
  totalrow = totalrow + rowcount;

  INSERT INTO public.hist_Two
    (select * from public.main_Two
    WHERE udate < (saveTime - ($1::text || ' months')::interval));

  GET DIAGNOSTICS rowcount = ROW_COUNT;
  totalrow = totalrow + rowcount;

  INSERT INTO public.hist_Three
    (select * from public.main_Three
    WHERE udate < (saveTime - ($1::text || ' months')::interval));

  GET DIAGNOSTICS rowcount = ROW_COUNT;
  totalrow = totalrow + rowcount;

  -- the rest of your function here    

  return totalrow;
END;
$BODY$;

Абсолютно не связано, и это, вероятно, не имеет значения, но я бы сделал несколько месяцев немного иначе:

INSERT INTO public.hist_One
select * from public.main_One
WHERE udate < saveTime - interval '1 month' * $1;

Или, может быть, даже лучше объявить значение один раз:

DECLARE
  from_date date;

from_date := current_date - interval '1 month' * $1;

А затем используйте его для каждого запроса:

INSERT INTO public.hist_One
select * from public.main_One
WHERE udate < from_date;

Преимущество этого в том, что я могу видеть случаи, когда вычисление динамического c подавляет использование индекса, тогда как это будет отправлено как stati c и определенно воспользуется любыми индексами в столбце "udate".

Кроме того, комментатор, имя которого я не могу напечатать, является правильным - PostgreSQL поддерживает хранимые процедуры начиная с версии 11 ... хотя в этом случае, так как вы хотите вернуть количество строк, функция кажется лучше.

0 голосов
/ 27 февраля 2020

Подумав, как лучше вернуть счетчик вставок и удалить счетчик, я решил создать отдельную таблицу с именем loadinfo и как часть функции вставить счетчик в таблицу loadinfo после завершения таблиц «Загрузка в историю». , Таким образом, я могу иметь вставки и удаления в таблицу Hist для справки

CREATE FUNCTION public.insertfour_stats(integer)
    RETURNS void
    LANGUAGE plpgsql

AS $BODY$

DECLARE
    saveTime timestamp;
    from_date date;
    FuncInvoke varchar;
BEGIN
   saveTime := now();
   from_date := current_date - interval '1 month'*$1;
   FuncInvoke := 'Insert to Hist';

INSERT INTO public.Hist_One
    (select * from public.Main_One
    WHERE udate < from_date);

INSERT INTO public.Hist_Two
    (select * from public.Main_Two
    WHERE udate < from_date);

INSERT INTO public.loadinfo(bdate, FuncInvoke, summary_hist_insert, account_hist_insert)
(SELECT saveTime, FuncInvoke
 , (select count(*) from public.Main_One WHERE udate < from_date)
 , (select count(*) from public.Main_Two WHERE udate < from_date));

delete from public.Main_One
where udate < from_date;

delete from public.Main_Two
where udate < from_date;

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