Pl/pgSQL il n'y a pas de paramètre $1 dans l'instruction EXECUTE

Je n'arrive pas à résoudre ça :

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;

En essayant

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

renvoyer le message suivant :

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

*** Erreur ***

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 source


Réponses (1)


Vous avez quelques problèmes ici. Le problème immédiat est le suivant :

ERREUR : il n'y a pas de paramètre $1

Cela se produit parce que $1 dans le SQL que vous transmettez à EXECUTE n'est pas le même que $1 dans le corps de la fonction principale. Les espaces réservés numérotés dans EXECUTE SQL se trouvent dans le contexte d'EXECUTE, pas dans le contexte de la fonction, vous devez donc fournir quelques arguments à EXECUTE pour ces espaces réservés :

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

Voir Exécution de commandes dynamiques dans le manuel pour plus de détails.

Le problème suivant est que vous ne renvoyez rien de votre fonction RETURNS integer. Je ne sais pas ce que vous avez l'intention de retourner, mais peut-être que votre tablea a un SERIAL id que vous aimeriez retourner. Si c'est le cas, alors vous voulez quelque chose qui ressemble davantage à ceci :

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

dans votre fonction.

person mu is too short    schedule 10.10.2013
comment
@mu est trop court : c'est la même erreur que celle que j'obtiens dans ma fonction SQL. Je n'ai pas réussi à le résoudre, peut-être avez-vous quelques conseils ? -Merci! stackoverflow.com/ questions/19918385/ - person jO.; 14.11.2013