DROP FUNCTION IF EXISTS public.sp_f005paystatusload;
DROP PROCEDURE IF EXISTS public.sp_f005paystatusload;

CREATE PROCEDURE public.sp_f005paystatusload (
	"Xml" bytea,
	"FileName" character varying
)
LANGUAGE plpgsql
AS $BODY$
DECLARE
	--меняем кодировку исходного файла на кодировку базы данных, убираем указание на старую кодировку
	xml_doc xml = REPLACE(convert_from("Xml", 'WIN1251'), 'encoding="windows-1251"', '') :: xml;
BEGIN
	DROP TABLE IF EXISTS temp_f005;

	--парсим xml_doc в временную таблицу
	CREATE TEMP TABLE temp_f005 AS 
	SELECT
		ididst,
		stname,
		CASE WHEN datebeg = '' THEN NULL ELSE datebeg :: TIMESTAMP END,
		CASE WHEN dateend = '' THEN NULL ELSE dateend :: TIMESTAMP END
	FROM
		XMLTABLE ('/packet/zap' PASSING xml_doc COLUMNS
			ididst INT path './IDIDST',
			stname TEXT path './STNAME',
			datebeg TEXT path './DATEBEG',
			dateend TEXT path './DATEEND'
		)
	;
	
	-- обновляем существующие записи
	UPDATE ies.t_f005_pay_status AS f005
	SET
		stname = tmp.stname,
		dateend = tmp.dateend
	FROM
		temp_f005 AS tmp
	WHERE
		tmp.ididst = f005.ididst
	;

	-- вставляем новые записи, если они есть
	INSERT INTO ies.t_f005_pay_status (
		ididst,
		stname,
		datebeg,
		dateend
	)
	SELECT
		tmp.ididst,
		tmp.stname,
		tmp.datebeg,
		tmp.dateend
	FROM
		temp_f005 AS tmp
	LEFT JOIN
		ies.t_f005_pay_status AS f005
		ON tmp.ididst = f005.ididst
	WHERE
		f005.ididst IS NULL
	;

	DROP TABLE IF EXISTS temp_f005;
END;
$BODY$;