Vous n'êtes pas identifié(e).

#1 31/07/2019 09:20:12

duple
Membre

ERROR: query returned no rows

Bonjour,
Je travaille sur PG9.6 environnement linux et je rencontre l'erreur suivante lors de l'execution d'une fonction -> "ERROR: query returned no rows" .
Vraiment je ne comprend pas l'intérêt de ce message d'erreur, pourquoi la requête ne renvoie t elle seulement pas une ligne vide avec valeur null si pas d'enregistrement, d'ailleurs c'est ce qui est le fonctionnement normale il me semble.
J'ai une requête je la teste avec un truc simple genre:

do $$
declare
x bigint;
begin

SELECT col_x INTO x
FROM table
WHERE col_a <> val_1
AND col_b = 'val_2'
AND col_c = val_3
AND col_d = val_4
AND col_e > 'val_51'::date
AND col_e < 'val_51'::date
AND col_f > 0
LIMIT 1;


raise notice 'x %',x;

end;
$$ language plpgsql;

La pas de problème la requête ne retourne rien , on a pas d'erreur , on a comme résultat :
NOTICE:  x <NULL>

Maintenant, je prend cette requête je la place dans une autre fonction bien plus complexe qui traite plusieurs lignes d'enregistrement.
Puis je tombe sur cette erreur que je ne comprend pas ERROR: query returned no rows
Pourquoi cette erreur ? Et comment la résoudre ? Il semble que la fonction pète lors de l’exécution de cette même requête (sachant que défois çà passe défois çà pète).

Please help !
Quelqu'un une idée la dessus ?
Merci

Hors ligne

#2 31/07/2019 09:29:02

gleu
Administrateur

Re : ERROR: query returned no rows

Ça va être un peu difficile de préconiser quoi que ce soit vu qu'on a le code de la fonction qui fonctionne et pas celui de la fonction qui ne fonctionne pas...


Guillaume.

Hors ligne

#3 31/07/2019 10:36:57

duple
Membre

Re : ERROR: query returned no rows

Ok, le bout de code suspect dans la fonction :
IF ((p_debut_i <= p_debut_j) AND (p_fin_i >= p_fin_j))THEN
            RAISE NOTICE 'debut FUS 3 idtli % deb i % fini % idtlj % debj % finj %',p_id_temp_i,p_debut_i,p_fin_i,p_id_temp_j,p_debut_j,p_fin_j;
                v_date1 := p_debut_j::date;
                v_date2 := p_debut_j::date +1;
               
                RAISE NOTICE 'SELECT id_temp INTO v_id_temp FROM t_temp WHERE pers = % AND proj = % AND id_op = % AND deb > % AND deb < % AND id_temp <> % AND duree > 0 LIMIT 1',p_pers_j,p_pers_j,p_op_j,v_date1,v_date2,p_id_temp_j;
                --C'EST ICI LE CODE SUSPECT QUI PETE
                SELECT id_temp INTO v_id_temp FROM t_temp WHERE pers = p_pers_j AND proj = p_proj_j AND id_op = p_op_j AND deb > v_date1 AND deb < v_date2 AND id_temp <> p_id_temp_j AND duree > 0 LIMIT 1;
                -- Pour certaine données l'execution de la fonction s'arrete ici et renvoie l'erreur ERROR :  query returned no rows                
                raise notice 'v_id_temp %',v_id_temp;
                IF (v_id_temp is not null) THEN
                    p_qte_j := COALESCE(p_qte_j,0);
                    EXECUTE 'UPDATE '||v_tfusion_temp_i||' SET qte = qte + '||p_qte_j||' WHERE id_temp = '||v_id_temp;
                    EXECUTE 'UPDATE t_temp SET qte = coalesce(qte,0) + '||p_qte_j||', com=''fusion temp: rajout qte du temp '||p_id_temp_j||' algo fus'' WHERE id_temp = '||v_id_temp;
                    PERFORM fusion_temp.update_quantity3(p_proj_j, p_op_j, p_id_temp_j, v_id_temp);
                   
                END IF;
               
                EXECUTE 'DELETE FROM '||v_tfusion_temp_j||' WHERE id_temp = '||p_id_temp_j;
                PERFORM fusion_temp.update_quantity_unicite(p_proj_j, p_op_j, p_id_temp_j, null::integer, null::integer, 'delete'::text);
                PERFORM fusion_temp.delete_temp(p_id_temp_j,p_id_temp_i,'algo fus');
                INSERT INTO fusion_temp.algo_debug(idtli,debi,fini,id_sysi,idtlj,debj,finj,id_sysj,login,algo_trouve,date_recherche) VALUES (p_id_temp_i,p_debut_i,p_fin_i,p_id_sys_i,p_id_temp_j,p_debut_j,p_fin_j,p_id_sys_j,p_pers_i,'algo fus',p_debut_i::date);
                RAISE NOTICE 'fin FUS 3 idtli % deb i % fini % idtlj % debj % finj %',p_id_temp_i,p_debut_i,p_fin_i,p_id_temp_j,p_debut_j,p_fin_j;
                RETURN 3;

Hors ligne

#4 31/07/2019 14:49:43

duple
Membre

Re : ERROR: query returned no rows

Sinon, est ce que quelqu'un connait quelles sont les actions qui peuvent engendrer l'erreur ERROR: query returned no rows ?

Hors ligne

#5 31/07/2019 14:56:52

rjuju
Administrateur

Re : ERROR: query returned no rows

duple a écrit :

Ok, le bout de code suspect dans la fonction :


Suspect ou coupable ?  Le message d'erreur devrait donner des informations sur la partie exacte du code retournant l'erreur.

Hors ligne

#6 31/07/2019 14:57:29

rjuju
Administrateur

Re : ERROR: query returned no rows

duple a écrit :

Sinon, est ce que quelqu'un connait quelles sont les actions qui peuvent engendrer l'erreur ERROR: query returned no rows ?


À priori une clause INTO STRICT dans une commande plpgsql.

Hors ligne

#7 01/08/2019 09:36:12

duple
Membre

Re : ERROR: query returned no rows

rjuju a écrit :
duple a écrit :

Ok, le bout de code suspect dans la fonction :


Suspect ou coupable ?  Le message d'erreur devrait donner des informations sur la partie exacte du code retournant l'erreur.

Bah en fait, c'est aussi un souci, car tu vois le message d'erreur il n'indique pas la requête qui pose problème. Le message dit juste : ERROR: queyr returned no rows SQL state: P0002 Context: PL/pgSQL function fusion_temp.algo_fusion(bigint,bigint,bigint,text,text,bigint,bigint,bigint,boolean,boolean,integer)

Dernière modification par duple (01/08/2019 09:37:19)

Hors ligne

#8 01/08/2019 09:38:06

duple
Membre

Re : ERROR: query returned no rows

rjuju a écrit :
duple a écrit :

Sinon, est ce que quelqu'un connait quelles sont les actions qui peuvent engendrer l'erreur ERROR: query returned no rows ?


À priori une clause INTO STRICT dans une commande plpgsql.


>>> A j'ai que INTO dans mes requêtes mais pas STRICT

Hors ligne

#9 01/08/2019 09:46:36

gleu
Administrateur

Re : ERROR: query returned no rows

Normalement, le message indique aussi la ligne où l'erreur a été rencontrée.


Guillaume.

Hors ligne

#10 01/08/2019 09:48:46

gleu
Administrateur

Re : ERROR: query returned no rows

Le problème est surtout qu'on n'a pas un test possible à faire de notre côté pour voir le poblème et le corriger. Là, comme ça, ces lignes m'ont l'air correctes. Il nous faudrait un jeu de tests.


Guillaume.

Hors ligne

#11 01/08/2019 14:07:58

duple
Membre

Re : ERROR: query returned no rows

Ah je me suis trompé, en revérifiant il avait bien des INSERT INTO RETURNING INTO STRICT dans mon code. J'ai renforcé les conditions (verification de données ) pour entrer dans cette partie de "INSERT INTO" et c'est bon.

Les pistes de rjuju  et gleu : clause INTO STRICT et le numéro de ligne où l'eurreur est rencontré m'ont aidé.

Merci à tous.

Hors ligne

Pied de page des forums