Vous pouvez examiner une variable spéciale FOUND d'un type booléen. De la documentation:
FOUND commence faux dans chaque appel de fonction PL / pgSQL. Il est défini par chacun des types d'instructions suivants:
Une instruction SELECT INTO définit FOUND true si une ligne est affectée, false si aucune ligne n'est renvoyée.
Une instruction PERFORM définit FOUND true si elle produit (et supprime) une ou plusieurs lignes, false si aucune ligne n'est produite.
Les instructions UPDATE, INSERT et DELETE définissent FOUND true si au moins une ligne est affectée, false si aucune ligne n'est affectée.
Une instruction FETCH définit FOUND true si elle renvoie une ligne, false si aucune ligne n'est renvoyée.
Une instruction MOVE définit FOUND true si elle repositionne correctement le curseur, false dans le cas contraire.
Une instruction FOR ou FOREACH définit FOUND true si elle itère une ou plusieurs fois, sinon false. FOUND est défini de cette façon lorsque la boucle se termine; à l'intérieur de l'exécution de la boucle, FOUND n'est pas modifié par l'instruction de boucle, bien qu'il puisse être modifié par l'exécution d'autres instructions dans le corps de la boucle.
Les instructions RETURN QUERY et RETURN QUERY EXECUTE définissent FOUND true si la requête renvoie au moins une ligne, false si aucune ligne n'est renvoyée.
Les autres instructions PL / pgSQL ne modifient pas l'état de FOUND. Notez en particulier qu'EXECUTE modifie la sortie de GET DIAGNOSTICS, mais ne change pas FOUND.
FOUND est une variable locale dans chaque fonction PL / pgSQL; ses modifications n'affectent que la fonction actuelle.
select into
qui ne renvoie aucune donnée lèvera toujours une exception, non?