Bonjour à tous,
Je suis nouveau sur ce forum, mais aussi pour la programmation en pl/pgSQL. Avant d'écrire ce message, j'ai parcouru le forum par l'option recherche, mais je n'ai pas trouvé la solution à mon problème qui me parait pourtant basique.
Comme indiqué dans le sujet du message, je veux pouvoir modifier ma table sur pl/pgSQL pour ensuite l'afficher par un CREATE VIEW basique sur postgresql.
Ce que je veux précisément faire dans la fonction, c'est d'afficher les colonnes "ess_gid", "id_nd_ini", "id_nd_fin", "geom", "pkhexut" de la table "cours_d_eau_par_noeuds_hydro_2" lorsque les valeurs de la colonne pkhexut sont égales à 1000000. Je sais que c'est faisable directement sur PostgreSQL, mais je dois le réussir cette étape sur pl/pgSQL, parce que je ferais, plus tard, des traitements qui nécessiteront absolument ce langage, par l'utilisation de boucles. Je teste donc une boucle "simple" afin de me lancer plus tard dans des boucles plus complexes.
Après de multiples et nombreuses recherches sur le net, j'en suis arrivé à ce script :
DROP FUNCTION essai() CASCADE
CREATE OR REPLACE FUNCTION essai()
RETURNS TABLE (ess_gid int, id_nd_ini cours_d_eau_par_noeuds_hydro_2.id_nd_ini%TYPE, id_nd_fin cours_d_eau_par_noeuds_hydro_2.id_nd_fin%TYPE,
geom cours_d_eau_par_noeuds_hydro_2.geom%TYPE, pkhexut cours_d_eau_par_noeuds_hydro_2.pkhexut%TYPE) AS
$BODY$
DECLARE
totdiff integer;
pkhexut numeric[];
pkh numeric;
pkhtest numeric :=1000000;;
BEGIN
totdiff:=totdiff+1;
pkhexut[totdiff]:=pkh;
IF (pkhexut is NOT NULL) THEN
FOREACH pkhtest in ARRAY pkhexut
LOOP
RETURN QUERY
SELECT row_number()OVER()::integer AS ess_gid, conh.id_nd_ini, conh.id_nd_fin, conh.geom, conh.pkhexut
FROM cours_d_eau_par_noeuds_hydro_2 as conh
ORDER BY ess_gid;
END LOOP;
END IF;
END;
$BODY$
LANGUAGE plpgsql;
CREATE or replace VIEW essai1 as
select * from essai()
Lorsque je teste la fonction en elle-même, il m'est indiqué :
NOTICE: référence de type cours_d_eau_par_noeuds_hydro_2.id_nd_ini%TYPE convertie en numeric
NOTICE: référence de type cours_d_eau_par_noeuds_hydro_2.id_nd_fin%TYPE convertie en numeric
NOTICE: référence de type cours_d_eau_par_noeuds_hydro_2.geom%TYPE convertie en geometry
NOTICE: référence de type cours_d_eau_par_noeuds_hydro_2.pkhexut%TYPE convertie en numeric
La requête a été exécutée avec succès en 12 ms, mais ne renvoie aucun résultat.
Donc, pas de problème. Par contre, lorsque je teste la ligne
select * from essai()
, il m'est indiqué :
ERREUR: un indice de tableau dans une affectation ne peut pas être NULL
CONTEXT: fonction PL/pgsql essai(), ligne 9 à affectation
********** Erreur **********
ERREUR: un indice de tableau dans une affectation ne peut pas être NULL
État SQL :22004
Contexte : fonction PL/pgsql essai(), ligne 9 à affectation
Il m'indique que l'affectation ne peut pas être NULL alors que je précise justement IS NOT NULL à cet endroit.
Quel est le problème ?
Est-ce que j'utilise vraiment la bonne démarche pour ce que je veux faire ?
Merci d'avance de vos réponses...
0 commentaires:
Enregistrer un commentaire