Вы можете использовать диагностику 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 ... хотя в этом случае, так как вы хотите вернуть количество строк, функция кажется лучше.