Anda memiliki beberapa masalah di sini. Masalah langsungnya adalah:
Itu terjadi karena $1
di dalam SQL yang Anda berikan ke EXECUTE tidak sama dengan $1
di dalam badan fungsi utama. Placeholder bernomor dalam EXECUTE SQL berada dalam konteks EXECUTE, bukan dalam konteks fungsi sehingga Anda perlu memberikan beberapa argumen ke EXECUTE untuk placeholder tersebut:
execute '...' using dpol_cia, dpol_tipol, dpol_nupol, dpol_conse, dpol_date;
-- ^^^^^
Lihat Menjalankan Perintah Dinamis di manual untuk detailnya.
Masalah berikutnya adalah Anda tidak mengembalikan apa pun dari fungsi Anda yang RETURNS integer
. Saya tidak tahu apa yang ingin Anda kembalikan, tetapi mungkin tablea
Anda memiliki SERIAL id
yang ingin Anda kembalikan. Jika demikian, maka Anda menginginkan sesuatu yang lebih seperti ini:
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
dalam fungsi Anda.