Pl/pgSQL няма параметър $1 в оператора EXECUTE

Не мога да реша това:

CREATE OR REPLACE FUNCTION dpol_insert(
    dpol_cia integer, dpol_tipol character, dpol_nupol integer,
    dpol_conse integer,dpol_date timestamp)
  RETURNS integer AS
$BODY$
    DECLARE tabla text := 'dpol'||EXTRACT (YEAR FROM $5::timestamp);
BEGIN
    EXECUTE '
    INSERT INTO '|| quote_ident(tabla) ||' 
    (dpol_cia, dpol_tipol, dpol_nupol, dpol_conse, dpol_date) VALUES ($1,$2,$3,$4,$5)
    ';
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

При опити

SELECT dpol_insert(1,'X',123456,1,'09/10/2013')

върнете следващото съобщение:

ERROR:  there is no parameter $1
LINE 3: ...tipol, dpol_nupol, dpol_conse, dpol_date) VALUES ($1,$2,$3,$...
                                                             ^
QUERY:  
    INSERT INTO dpol2013 
    (dpol_cia, dpol_tipol, dpol_nupol, dpol_conse, dpol_date) VALUES ($1,$2,$3,$4,$5)

CONTEXT:  PL/pgSQL function "dpol_insert" line 4 at EXECUTE statement

*** Грешка ***

ERROR: there is no parameter $1
SQL state: 42P02
Context: PL/pgSQL function "dpol_insert" line 4 at EXECUTE statement

person stefmex    schedule 10.10.2013    source източник


Отговори (1)


Тук имате няколко проблема. Непосредственият проблем е:

ГРЕШКА: няма параметър $1

Това се случва, защото $1 в SQL, който предавате на EXECUTE, не е същото като $1 в тялото на основната функция. Номерираните контейнери в рамките на EXECUTE SQL са в контекста на EXECUTE, а не в контекста на функцията, така че трябва да предоставите някои аргументи на EXECUTE за тези контейнери:

execute '...' using dpol_cia, dpol_tipol, dpol_nupol, dpol_conse, dpol_date;
--            ^^^^^

Вижте Изпълнение на динамични команди в ръководството за подробности.

Следващият проблем е, че не връщате нищо от вашата функция, която RETURNS integer. Не знам какво възнамерявате да върнете, но може би вашият tablea има SERIAL id, който бихте искали да върнете. Ако е така, тогава искате нещо повече като това:

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

във вашата функция.

person mu is too short    schedule 10.10.2013
comment
@mu е твърде кратък: Това е същата грешка, която получавам в моята SQL функция. Не успях да го реша, може би имате някои насоки? -Благодаря! stackoverflow.com/ въпроси/19918385/ - person jO.; 14.11.2013