PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#26 02/02/2021 11:43:15

Christof25
Membre

Re : Sql avec paramètres et condition IF

Là, sauf erreur de ma part, j'ai un doute car dans la doc https://docs.postgresql.fr/9.3/sql-synt … funcs.html , il n'y en avait pas.

Si je le rajoute, c'est ce que je disais avant, la fonction n'est plus reconnue...

psql:test.sql:9: ERROR:  function log_notice(unknown) does not exist
LINE 1: SELECT log_notice('TINTIN');
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Autre idée?

Hors ligne

#27 02/02/2021 12:34:28

dverite
Membre

Re : Sql avec paramètres et condition IF

C'est parce qu'il y a d'autres erreurs dans la déclaration. En fait il y en a 3:

CREATE FUNCTION log_notice(text) AS $$;
DECLARE
    user ALIAS FOR $1;
BEGIN
    RAISE NOTICE 'creation user % done!', user;
END;
$$

1. Sur la première ligne il ne doit pas y avoir de point virgule à la fin.

2. Après le $$ final (dernière ligne) il faut ajouter

 LANGUAGE plpgsql

3. Il faut ajouter un point virgule final à la fin de tout ça pour clore le CREATE FUNCTION en tant qu'instruction. Que ce soit directement collé à LANGUAGE plpgsql ou sur la ligne d'après, le choix est libre.

Quand vous dites que dans la doc il n'y a pas de point virgule, si il y est, mais sur la ligne d'après après le LANGUAGE plpgsql qui fait partie de l'ensemble de l'instruction.



Alternativement dans le script psql vous pouvez utiliser \echo pour faire un affichage côté client sans solliciter le SQL.

  \echo [-n] [TEXTE]     écrit le texte sur la sortie standard (-n pour supprimer le retour à la ligne)

Hors ligne

#28 02/02/2021 15:19:41

Christof25
Membre

Re : Sql avec paramètres et condition IF

dverite a écrit :

C'est parce qu'il y a d'autres erreurs dans la déclaration. En fait il y en a 3:

Alternativement dans le script psql vous pouvez utiliser \echo pour faire un affichage côté client sans solliciter le SQL.

  \echo [-n] [TEXTE]     écrit le texte sur la sortie standard (-n pour supprimer le retour à la ligne)

Bon, je clos cette discussion car c'est ce que je recherchais depuis hier. Merci dverite et je garde de côté tes bons conseils.
C'est une solution toute simple.
Pour la petite histoire, dans les exemples, je voyais bien 'LANGUAGE plpgsql' mais je pensais que c'était à remplacer par du code, la suite du programme.... Bref, je le saurai la prochaine fois.

Merci aussi à rjuju et gleu.

Hors ligne

#29 02/02/2021 15:33:40

gleu
Administrateur

Re : Sql avec paramètres et condition IF

Quand vous avez un problème avec une requête, n'en exécutez pas deux à la fois. Si vous n'aviez exécuté que le CREATE FUNCTION, vous auriez eu toujours une erreur mais un message bien plus explicatif :

CREATE FUNCTION log_notice(text) AS $$;
DECLARE
    user ALIAS FOR $1;
BEGIN
    RAISE NOTICE 'creation user % done!', user;
END;
$$ LANGUAGE plpgsql;
ERROR:  no language specified

Du coup, on s'aperçoit qu'il manque la clause LANGUAGE, ce qui donne :

CREATE FUNCTION log_notice(text) AS $$;
DECLARE
    user ALIAS FOR $1;
BEGIN
    RAISE NOTICE 'creation user % done!', user;
END;
$$ LANGUAGE plpgsql;
ERROR:  function result type must be specified

De nouveau une erreur, il manque le type en retour. En effet, c'est une fonction, donc ça renvoit des données. Dans le cas présent, une procédure serait certainement plus intelligent mais continuons avec la fonction :

CREATE FUNCTION log_notice(text) RETURNS boolean AS $$;
DECLARE
    user ALIAS FOR $1;
BEGIN
    RAISE NOTICE 'creation user % done!', user;
    RETURN true;
END;
$$ LANGUAGE plpgsql;
ERROR:  syntax error at or near ";"
LINE 1: CREATE FUNCTION log_notice(text) RETURNS boolean AS $$;
                                                              ^

De nouveau une erreur. Le point-virgule derrière le premier $$ ne sert à rien. Il est même problématique. Donc on le supprime :

CREATE FUNCTION log_notice(text) RETURNS boolean AS $$
DECLARE
    user ALIAS FOR $1;
BEGIN
    RAISE NOTICE 'creation user % done!', user;
    RETURN true;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION

Et assez logiquement, ça finit par fonctionner. La preuve :

SELECT log_notice('toto');
NOTICE:  creation user postgres done!
┌────────────┐
│ log_notice │
├────────────┤
│ t          │
└────────────┘
(1 row)

Ceci étant dit, une procédure serait certainement plus intelligente :

CREATE PROCEDURE log_notice(text) AS $$
BEGIN
    RAISE NOTICE 'creation user % done!', $1;
END;
$$ LANGUAGE plpgsql;

CALL log_notice('Hannah');
NOTICE:  creation user Hannah done!

Guillaume.

Hors ligne

Pied de page des forums