FAQ UDF
FAQ UDFConsultez toutes les sources
Nombre d'auteurs : 3, nombre de sources : 37, création le 1er mars 2013
- 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)