FAQ UDFConsultez toutes les sources

Nombre d'auteurs : 3, nombre de sources : 37, création le 1er mars 2013 

 
OuvrirSommaireFonctions sur les nombres
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."estimpair" (nombre integer) RETURNS boolean AS
$body$
/* Cette fonction retourne true (vrai) si le nombre passé en argument est impair 
 
   Exemple :  SELECT estimpair(12);
              false
*/
BEGIN
 return nombre % 2!=0;
END;
$body$
LANGUAGE 'plpgsql';
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."estpair" (nombre integer) RETURNS boolean AS
$body$
/* Cette fonction retourne true (vrai) si le nombre passé en argument est pair
 
   Exemple :  SELECT estimpair(12);
              true
 
 */
BEGIN
 return nombre % 2=0;
END;
$body$
LANGUAGE 'plpgsql';
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez


CREATE OR REPLACE FUNCTION "public"."nombreenlettre" (nombre integer) RETURNS text AS
$body$
/* 
  Converti un nombre en lettre

  Exemple :  SELECT nombreenlettre(5423);
             cinq mille quatre cent vingt trois
 */
DECLARE
 unite text[]='{"un","deux","trois","quatre","cinq","six",
                "sept","huit","neuf","dix","onze","douze",
                "treize","quatorze","quinze","seize"}';
 dizaine text[] ='{"vingt","trente","quarante","cinquante",
                   "soixante","","quatre-vingt"}';
 coefs text[] ='{"cent","mille","million","milliard"}';
 temps text;
 c int2;
 d int2;
 u int2;
 coef int2 = 0;
 i int2;
 neg boolean;
 resultat text = '';
 n integer;
BEGIN
  n:=nombre;
  
  IF n=0 THEN
   return 'zéro';
  END IF;

  neg:=n<0;
  IF neg=true THEN
    n:=-n;
  END IF;

  LOOP
   u:=n%10;
   n:=n/10;
   d:=n%10;
   n:=n/10; 
   IF d in (1,7,9) THEN
     d:=d-1;
     u:=u+10;
   END IF;
   temps:='';
   IF d>1 THEN
    temps:=' '||dizaine[d-1];
    IF (d<8) and ((u=1) or (u=11)) THEN
     temps:=temps||' et';
    END IF;
   END IF;
   IF u>16 THEN
    temps:=temps||' '||unite[10];
    u:=u-10;
   END IF;
   IF u>0 THEN
    temps:=temps||' '||unite[u];
   END IF;
   IF (resultat='') and (d=8) and (u=0) THEN
    resultat:='s';
   END IF;
   resultat:=temps||resultat;
   c:=n%10;
   n:=n/10;
   IF c>0 then
    temps:='';
    IF c>1 THEN
     temps:=' '||unite[c]||temps;
    END IF;
    temps:=temps||' '||coefs[1];
    IF (resultat='') and (c>1) THEN
     resultat:='s';
    END IF;
    resultat:=temps||resultat;
   END IF;
   IF n>0 THEN
    coef:=coef+1;
    i:=n%1000;
    IF (i>1) and (coef>1) THEN
     resultat:='s'||resultat;
    END IF;
    IF i>0 THEN
     resultat:=' '||coefs[coef+1]||resultat;
    END IF;
    IF (i=1) and (coef=1) THEN
     n:=n-1;
    END IF;
   END IF;
   EXIT WHEN n=0;
  END LOOP;

  IF neg THEN
   resultat:='moins'||resultat;
  END IF;
  
  return resultat;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
select nombreenlettre(6234);
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."inttobin" (nombre integer) RETURNS text AS
$body$
/* 
  converti un entier en une chaine de caractere binaire
  Exemple : SELECT inttobin(255);
            11111111
*/
DECLARE
 n integer;
 signe varchar(1);
 bit_out text = '';
BEGIN
 n:=nombre;
 
 -- valeur basique
 IF n=0 THEN
  return '0';
 END IF;
 
 -- signe négatif
 signe:='';
 IF n<0 THEN
  signe='-';
 END IF;
 
 -- conversion
 WHILE NOT n=0 LOOP
  IF n%2=0 THEN
   bit_out:='0'||bit_out;
  ELSE
   bit_out:='1'||bit_out;
  END IF;
  n:=n/2;
 END LOOP;
 
 return signe||bit_out;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."hextoint" (hexa text) RETURNS bigint AS
$body$
/* 
   Converti une chaire hexa en un bigint 
 
   Exemple : SELECT hextoint('FA');
             250
*/
DECLARE
 h text;
 signe varchar(1) = '';
 int_out bigint = 0;
 ch char(1);
 i integer = 0;
BEGIN
 h:=hexa;
 
 -- valeur basique
 h:=trim(both 'u' from upper(h));
 IF h='' THEN
  return null;
 END IF;
 
 -- signe négatif
 IF substring(h from 1 for 1) = '-' THEN
  signe:='-';
  h:=substring(h from 2 for length(h)-1);
 END IF;
 IF substring(h from 1 for 1) = '+' THEN
  signe:='';
  h:=substring(h from 2 for length(h)-1);
 END IF;
 h:=rtrim(h);
 
 -- conversion
 WHILE i<length(h) LOOP
  ch:=substring(h from length(h)-i for 1);
  int_out:=int_out+power(16,i) *
   CASE WHEN position(ch in '0123456789ABCDEF')>0
   THEN position(ch in '0123456789ABCDEF')-1
   ELSE null END;
  i:=i+1;
 END LOOP;
 
 return int_out * CASE WHEN signe='-' THEN -1 ELSE 1 END;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."pgcd" (aa integer, bb integer) RETURNS integer AS
$body$
/* 
  Plus Grand Commun Diviseur
 
  Exemple : SELECT pgcd(12,30);
            6
 */
DECLARE
 reste integer;
 a integer;
 b integer;
BEGIN
 a:=aa;
 b:=bb;
 LOOP
  reste:=a%b;
  a:=b;
  b:=reste;
  EXIT WHEN reste=0;
 END LOOP;
 return abs(a);
end;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."fibonacci_ite" (nombre integer) RETURNS bigint AS
$body$
/* Algo de Fibonnaci version itératif
 
   Exemple : SELECT fibonacci_ite(10);
             89
 
 */
DECLARE
 a bigint = 1;
 b bigint = 1;
 i bigint;
 t bigint = 1;
BEGIN
 FOR i IN 1..nombre-1 LOOP
  t:=a+b;
  a:=b;
  b:=t;
 END LOOP;
 return t;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."fibonacci_rec" (nombre bigint) RETURNS bigint AS
$body$
/*
 Algo de Fibonacci version recursive
 La version récursive est vraiment trop lente
 je la met juste pour montrer comment faire.
*/
DECLARE
 t bigint = 0;
BEGIN
 IF nombre=0 THEN
  t:=1;
 END IF;
 IF nombre=1 then
  t:=1;
 END IF;
 IF nombre>1 THEN
  t:=fibonnaci_rec(nombre-1)+fibonnaci_rec(nombre-2);
 END IF;
 return t;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."factoriel_ite" (nombre integer) RETURNS bigint AS
$body$
/*
 Factoriel version itérative
  n! = n*(n-1)*(n-2)*(n-3)*...*2*1
  1! = 1
  0! = 1
  Exemple: SELECT factoriel_ite(5) 
           120
 
  Il existe l'opérateur : ! 
   SELECT 5!
   120         
*/
DECLARE
 f bigint = 1;
 i bigint;
BEGIN
 FOR i IN 2..nombre LOOP
  f:=f*i;
 END LOOP;
 return f;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."factoriel_rec" (nombre integer) RETURNS bigint AS
$body$
/* Factoriel version récursive */
BEGIN
 IF nombre>1 THEN
   return nombre * factoriel_rec(nombre-1);
 ELSE
  return 1;
 END IF;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."estpremier" (prem bigint) RETURNS boolean AS
$body$
/*
    Teste si le nombre passé en parametre est premier
 
    Exemple : SELECT estpremier(41047),estpremier(12322);
              TRUE    FALSE
 
*/
DECLARE
 z float4;
 maxi bigint;
 diviseur bigint;
BEGIN
 IF (prem & 1)=0 THEN
  return false;
 END IF;
 z:=sqrt(prem);
 maxi:=trunc(z)+1;
 diviseur:=3;
 WHILE maxi>diviseur LOOP
  IF (prem%diviseur)=0 THEN
   return false;
  END IF;
  diviseur:=diviseur+2;
  IF (prem%diviseur)=0 THEN
   return false;
  END IF;
  diviseur:=diviseur+4;
 END LOOP;
 return true;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."random" (minimum integer, maximum integer) RETURNS integer AS
$body$
/*
  Fonction random surchargée
  arguments : minimum
              maximum
  retourne une nombre aléatoire compris entre minimum et maximum
 
  Exemple : SELECT random(30,50);
            39
 */
BEGIN
 return round(random()*(maximum-minimum))+minimum;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."secante" (double precision) RETURNS double precision AS
$body$
/* Fonction Sécante */
SELECT 1/cos($1);
$body$
LANGUAGE 'sql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."cosecante" (double precision) RETURNS double precision AS
$body$
/* Fonction CoSécante */
SELECT 1/sin($1);
$body$
LANGUAGE 'sql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 20 août 2005  par Damien Griessinger (HpAlpha)
 
Sélectionnez

CREATE OR REPLACE FUNCTION "public"."strtointdef" (text, integer) RETURNS integer AS
$body$
/*
   Converti une chaine ($1) en un entier si possible sinon on prend $2
 
   Exemple : SELECT strtointdef('6544','10'), strtointdef('-99','10'), strtointdef('5b6','10')
                6544              -99          10
 */
SELECT CASE WHEN $1 ~ '^[-+]?[0-9]+$' THEN $1::integer ELSE $2 END;
$body$
LANGUAGE 'sql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
Créé le 28 août 2005  par Damien Griessinger (HpAlpha)
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2005 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.