Pl/pgSQL nu există niciun parametru $1 în instrucțiunea EXECUTE

Nu pot rezolva asta:

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;

Când încerci

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

returnează următorul mesaj:

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

*** Eroare ****

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 sursă


Răspunsuri (1)


Ai câteva probleme aici. Problema imediată este:

EROARE: nu există parametru $1

Acest lucru se întâmplă deoarece $1 din SQL-ul pe care îl predați EXECUTE nu este același cu $1 din corpul funcției principale. Substituenții numerotați din EXECUTE SQL sunt în contextul EXECUTE, nu în contextul funcției, așa că trebuie să furnizați câteva argumente pentru EXECUTE pentru acei substituenți:

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

Consultați Executarea comenzilor dinamice în manualul pentru detalii.

Următoarea problemă este că nu returnați nimic din funcția dvs. care RETURNS integer. Nu știu ce intenționați să returnați, dar poate că tablea are un SERIAL id pe care ați dori să-l returnați. Dacă da, atunci vrei ceva mai de genul acesta:

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

în funcția dvs.

person mu is too short    schedule 10.10.2013
comment
@mu este prea scurt: aceasta este aceeași eroare pe care o primesc în funcția mea SQL. Nu am reușit să o rezolv, poate aveți câteva indicații? -Mulțumiri! stackoverflow.com/ întrebări/19918385/ - person jO.; 14.11.2013