Pl/pgSQL ei ole parametria $1 EXECUTE-käskyssä

En osaa ratkaista tä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;

Kun yrittää

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

palauta seuraava viesti:

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

*** Virhe ***

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 lähde


Vastaukset (1)


Sinulla on pari ongelmaa tässä. Välitön ongelma on:

VIRHE: parametria $1 ei ole

Näin tapahtuu, koska $1 SQL:n sisällä, jonka annat EXECUTE:lle, ei ole sama kuin $1 pääfunktion rungossa. EXECUTE SQL:n numeroidut paikkamerkit ovat EXECUTE:n kontekstissa, eivät funktion kontekstissa, joten sinun on annettava joitain argumentteja EXECUTE:lle näille paikkamerkeille:

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

Katso Dynaamisten komentojen suorittaminen käyttöohjeesta lisätietoja.

Seuraava ongelma on, että et palauta mitään funktiostasi, joka RETURNS integer. En tiedä mitä aiot palauttaa, mutta ehkä laitteessasi tablea on SARJA id, jonka haluaisit palauttaa. Jos on, niin haluat jotain lisää tämän kaltaista:

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

tehtävässäsi.

person mu is too short    schedule 10.10.2013
comment
@mu on liian lyhyt: Tämä on sama virhe, jonka saan SQL-funktiossani. En ole pystynyt ratkaisemaan sitä, ehkä sinulla on vinkkejä? -Kiitos! stackoverflow.com/ kysymyksiä/19918385/ - person jO.; 14.11.2013