Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Il semble que la fonction RANDOM ne veuille jamais rien savoir lorsqu'elle est incorporée dans une fonction PG au sein d'un INTERVAL...
Exemple :
CREATE OR REPLACE FUNCTION F_TEST (n1 INT, n2 INT)
RETURNS TIMESTAMP STABLE AS $$
DECLARE n3 INT;
BEGIN
n3 = n1 + n2 + FLOOR(10 * RANDOM());
RETURN CAST('2011-01-01' AS TIMESTAMP) + INTERVAL '$3 DAYS';
END; $$ LANGUAGE plpgsql ;
à la place de STABLE, vous pouvez mettre ce que vous voulez : VOLATILE, IMMUTABLE....
Bref, l'exécution de cette fonction :
SELECT F_TEST (1, 2)
Ne donne jamais que toujours la même chose :
2011-01-04 00:00:00
Moi je chercher à faire quelque chose d'aléatoire !!!!
A +
Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES, Expert langage SQL
Le site sur les SGBD relationnel et langage SQL : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA, ISEN Toulon, CESI Aix en Provence * * * * *
Hors ligne
Pas un bug. Vous indiquez $3 qui ne correspond à rien vu que la fonction n'a que deux arguments. Du coup, interval '$3 days' est compris comme interval '3 days', ce qui explique qu'il renvoie toujours le 4 janvier.
Au lieu de $3, il faut indiquer la variable contenant le résultat du calcul. Voici la fonction corrigée :
CREATE OR REPLACE FUNCTION F_TEST (n1 INT, n2 INT)
RETURNS TIMESTAMP STABLE AS $$
DECLARE n3 INT;
BEGIN
n3 = n1 + n2 + FLOOR(10 * RANDOM());
RETURN CAST('2011-01-01' AS TIMESTAMP) + n3 * INTERVAL '1 DAYS';
END; $$ LANGUAGE plpgsql ;
Guillaume.
Hors ligne
Mea culpa et merci ! J'ai cherché une syntaxe bien plus compliquée !
A +
Dernière modification par SQLpro (21/03/2011 11:12:42)
Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES, Expert langage SQL
Le site sur les SGBD relationnel et langage SQL : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA, ISEN Toulon, CESI Aix en Provence * * * * *
Hors ligne
Pages : 1