FAQ UDF

FAQ UDFConsultez toutes les sources
Nombre d'auteurs : 3, nombre de sources : 37, création le 1er mars 2013
Sommaire→Fonctions sur les nombres- Tester si un nombre est impair
- Tester si un nombre est pair
- Convertir un nombre en lettre
- Convertir un entier en binaire (chaine)
- Convertir une chaine hexadecimale en entier
- Calcul du Plus Grand Commun Diviseur (PGCD)
- Fibonacci itératif
- Fibonacci récursif
- Factoriel itératif
- Factoriel récursif
- Tester si le nombre est premier
- Générer un nombre aléatoire paramétré
- Fonction sécante
- Fonction CoSécante
- Convertir une chaine en entier avec choix d'une valeur de retour si impossible
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)



