Pl/pgSQL nuk ka asnjë parametër $1 në deklaratën EXECUTE

Unë nuk mund ta zgjidh këtë:

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;

Kur provoni

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

kthe mesazhin tjetër:

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

*** Gabim ***

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 burimi


Përgjigjet (1)


Ju keni disa probleme këtu. Problemi i menjëhershëm është:

GABIM: nuk ka asnjë parametër $1

Kjo ndodh sepse $1 brenda SQL që po ia dorëzoni EXECUTE nuk është i njëjtë me $1 brenda trupit të funksionit kryesor. Vendmbajtësit e numëruar brenda EXECUTE SQL janë në kontekstin e EXECUTE, jo në kontekstin e funksionit, kështu që ju duhet të jepni disa argumente për EXECUTE për ato mbajtëse vendesh:

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

Shiko Ekzekutimi i komandave dinamike në manualin për detaje.

Problemi tjetër është se ju nuk po ktheni asgjë nga funksioni juaj i cili RETURNS integer. Nuk e di se çfarë keni ndërmend të ktheni, por ndoshta tablea juaj ka një SERIALE id që dëshironi ta ktheni. Nëse po, atëherë dëshironi diçka më shumë si kjo:

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ë funksionin tuaj.

person mu is too short    schedule 10.10.2013
comment
@mu është shumë i shkurtër: Ky është i njëjti gabim që marr në funksionin tim SQL. Unë nuk kam qenë në gjendje ta zgjidh atë, ndoshta keni disa tregues? -Faleminderit! stackoverflow.com/ pyetje/19918385/ - person jO.; 14.11.2013