Vous n'êtes pas identifié(e).
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
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)
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
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
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