Masz tutaj kilka problemów. Najpilniejszym problemem jest:
Dzieje się tak, ponieważ $1
wewnątrz kodu SQL, który przekazujesz do EXECUTE, nie jest tym samym, co $1
wewnątrz głównego korpusu funkcji. Ponumerowane symbole zastępcze w EXECUTE SQL znajdują się w kontekście EXECUTE, a nie w kontekście funkcji, więc musisz podać kilka argumentów do EXECUTE dla tych symboli zastępczych:
execute '...' using dpol_cia, dpol_tipol, dpol_nupol, dpol_conse, dpol_date;
-- ^^^^^
Zobacz Wykonywanie poleceń dynamicznych w instrukcji, aby uzyskać szczegółowe informacje.
Następnym problemem jest to, że nie zwracasz niczego z funkcji, która RETURNS integer
. Nie wiem, co zamierzasz zwrócić, ale może Twoja tablea
ma SERIAL id
że chcesz wrócić. Jeśli tak, to chcesz czegoś bardziej takiego:
declare
tabla text := 'dpol' || extract(year from $5::timestamp);
id integer;
begin
execute 'insert into ... values ($1, ...) returning id' into id using dpol_cia, ...;
-- ^^^^^^^^^^^^ ^^^^^^^
return id;
end
w swojej funkcji.