Les meilleures sources PostgreSQL
Les meilleures sources PostgreSQLConsultez toutes les sources
Nombre d'auteurs : 4, nombre de sources : 38, dernière mise à jour : 20 juin 2005
CREATE
OR
REPLACE
FUNCTION
"public"
."soundexfr"
(
text
)
RETURNS
text
AS
$body
$
/*
Fonction SOUNDEX francisé
Exemple : SELECT soundexfr('durand'),soundexfr('durhand'),soundexfr('durond'),soundexfr('dupond');
D653 D653 D653 D153
*/
DECLARE
st text
;
st2 text
;
i int2
;
ch char
;
BEGIN
st2:=
''
;
-- on transforme les voyelles et on passe en majuscule
st:=
translate
(
$1
,'aàäâeéèêëiïîoôöuùûücç'
,'AAAAEEEEEIIIOOOUUUUCC'
)
;
st:=
upper
(
st)
;
-- on enleve les espaces
FOR
i IN
1
..length
(
st)
LOOP
IF
substring
(
st,i,1
)&
lt;>
' '
THEN
st2:=
st2||
substring
(
st,i,1
)
;
END
IF
;
END
LOOP
;
st:=
''
;
FOR
i IN
1
..length
(
st2)
LOOP
IF
NOT
(
substring
(
st2,i,1
)
IN
(
'A'
,'E'
,'I'
,'O'
,'U'
,'Y'
,'H'
,'W'
))
THEN
st:=
st||
substring
(
st2,i,1
)
;
END
IF
;
END
LOOP
;
st2:=
substring
(
st,1
,1
)
;
FOR
i IN
2
..length
(
st)
LOOP
ch:=
substring
(
st,i,1
)
;
IF
ch IN
(
'B'
,'P'
)
THEN
st2:=
st2||
'1'
;
ELSIF
ch IN
(
'C'
,'K'
,'Q'
)
THEN
st2:=
st2||
'2'
;
ELSIF
ch IN
(
'D'
,'T'
)
THEN
st2:=
st2||
'3'
;
ELSIF
ch=
'L'
THEN
st2:=
st2||
'4'
;
ELSIF
ch IN
(
'M'
,'N'
)
THEN
st2:=
st2||
'5'
;
ELSIF
ch=
'R'
THEN
st2:=
st2||
'6'
;
ELSIF
ch IN
(
'G'
,'J'
)
THEN
st2:=
st2||
'7'
;
ELSIF
ch IN
(
'S'
,'X'
,'Z'
)
THEN
st2:=
st2||
'8'
;
ELSIF
ch IN
(
'F'
,'V'
)
THEN
st2:=
st2||
'9'
;
END
IF
;
END
LOOP
;
st:=
substring
(
st2,1
,1
)
;
FOR
i IN
1
..length
(
st2)
LOOP
IF
substring
(
st2,i,1
)
&
lt;>
substring
(
st,length
(
st)
,1
)
THEN
st:=
st||
substring
(
st2,i,1
)
;
END
IF
;
END
LOOP
;
IF
length
(
st)&
lt;4
THEN
FOR
i IN
length
(
st)
..4
LOOP
st:=
st||
'0'
;
END
LOOP
;
ELSIF
length
(
st)>
4
THEN
st:=
substring
(
st,1
,4
)
;
END
IF
;
return
st;
END
;
$body
$
LANGUAGE
'plpgsql'
VOLATILE RETURNS
NULL
ON
NULL
INPUT SECURITY
INVOKER
;
CREATE
OR
REPLACE
FUNCTION
"public"
."encode64"
(
chaine text
)
RETURNS
text
AS
$body
$
/*
Encodage en base 64
Exemple : SELECT encode64('Salut');
Ks5iTNG
*/
DECLARE
i integer
;
a integer
=
0
;
x
integer
;
b integer
=
0
;
resultat text
=
''
;
codes64 text
=
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'
;
BEGIN
FOR
i IN
1
..length
(
chaine)
LOOP
x
:=
ascii
(
substring
(
chaine from
i for
1
))
;
b:=
b*
256
+
x
;
a:=
a+
8
;
WHILE
a>=
6
LOOP
a:=
a-
6
;
x
:=
b/(
1
&
lt;&
lt;a)
;
b:=
b%(
1
&
lt;&
lt;a)
;
resultat:=
resultat||
substring
(
codes64 from
x
+
1
for
1
)
;
END
LOOP
;
END
LOOP
;
IF
a>
0
THEN
x
:=
b&
lt;&
lt;(
6
-
a)
;
resultat:=
resultat||
substring
(
codes64 from
x
+
1
for
1
)
;
END
IF
;
return
resultat;
END
;
$body
$
LANGUAGE
'plpgsql'
VOLATILE RETURNS
NULL
ON
NULL
INPUT SECURITY
INVOKER
;
CREATE
OR
REPLACE
FUNCTION
"public"
."decode64"
(
chaine text
)
RETURNS
text
AS
$body
$
/*
Decodage en base 64
Exemple : SELECT decode64('Ks5iTNG');
Salut
*/
DECLARE
i integer
;
a integer
=
0
;
x
integer
;
b integer
=
0
;
codes64 text
=
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'
;
resultat text
=
''
;
BEGIN
FOR
i IN
1
..length
(
chaine)
LOOP
x
:=
position
(
substring
(
chaine from
i for
1
)
in
codes64)-
1
;
IF
x
>=
0
THEN
b:=
b*
64
+
x
;
a:=
a+
6
;
IF
a>=
8
THEN
a:=
a-
8
;
x
:=
b>>
a;
b:=
b%(
1
&
lt;&
lt;a)
;
x
:=
x
%
6
;
resultat:=
resultat||
chr
(
x
)
;
END
IF
;
ELSE
Exit
;
END
IF
;
END
LOOP
;
return
resultat;
END
;
$body
$
LANGUAGE
'plpgsql'
VOLATILE RETURNS
NULL
ON
NULL
INPUT SECURITY
INVOKER
;
CREATE
OR
REPLACE
FUNCTION
"public"
."inverserchaine"
(
chaine text
)
RETURNS
text
AS
$body
$
/*
Inverse la chaine
Exempe : SELECT inverserchaine('postgresql');
lqsergtsop
*/
DECLARE
i integer
;
resultat text
=
''
;
BEGIN
FOR
i IN
REVERSE
length
(
chaine)
..1
LOOP
resultat:=
resultat||
substring
(
chaine from
i for
1
)
;
END
LOOP
;
return
resultat;
END
;
$body
$
LANGUAGE
'plpgsql'
VOLATILE RETURNS
NULL
ON
NULL
INPUT SECURITY
INVOKER
;
CREATE
OR
REPLACE
FUNCTION
"public"
."minimizetext"
(
text
)
RETURNS
text
AS
$body
$
/*
Fonction minimizetext
Permet de simplifier une phrase au maximum
-> Suppression des lettres en doubles
-> Conversion des accents
Exemple : SELECT minimizetext('hellllooooo monnnnndeeee');
helomonde
*/
DECLARE
chaine text
;
desti text
;
last
char
(
1
)
;
current
char
(
1
)
;
i integer
;
BEGIN
chaine:=
translate
(
lower
(
$1
)
,'àâéèêëîïìôòùû'
,'aaeeeeiiioouu'
)
;
chaine:=
replace
(
chaine,'-'
,''
)
;
chaine:=
replace
(
chaine,' '
,''
)
;
chaine:=
trim
(
chaine)
;
last
:=
' '
;
desti:=
''
;
FOR
i IN
1
..length
(
chaine)
LOOP
current
:=
substring
(
chaine,i,1
)
;
IF
current
&
lt;>
last
THEN
last
:=
current
;
desti:=
desti||
current
;
END
IF
;
END
LOOP
;
RETURN
desti;
END
;
$body
$
LANGUAGE
'plpgsql'
VOLATILE RETURNS
NULL
ON
NULL
INPUT SECURITY
INVOKER
;
CREATE
OR
REPLACE
FUNCTION
"public"
."stroccurence"
(
chaine text
, souschaine text
)
RETURNS
integer
AS
$body
$
/* Compte le nombre d'occurence d'une souschaine dans une chaine
Exemple : SELECT stroccurence('Ici un mot, et la un deuxieme mot','mot');
2
*/
BEGIN
return
array_upper(
string_to_array(
chaine,souschaine)
,1
)-
1
;
END
;
$body
$
LANGUAGE
'plpgsql'
VOLATILE CALLED ON
NULL
INPUT SECURITY
INVOKER
;
La fonction prend en entrée une chaine de caractère 'input' et renvoie en sortie une chaîne de caractères 'output' qui correspond à 'input' encodée en code128 pour la création de code-barres. Dans un logiciel de traitement de texte quelconque, il suffit d'appliquer la police code128 à la chaîne 'output' pour avoir une jolie succession de barres noires et blanches, lisible par un lecteur de code-barres quelconque (pourvu qu'il lise la police code128).
CREATE
FUNCTION
text2code128(
text
)
RETURNS
text
AS
$body
$
/*
Fonction pour transformer une chaine de caractere en chaine code 128
Traduction de la fonction VB de Grandzebu par Nicolas Fanchamps en PL/SQL
Portage de PL/SQL vers PL/pgsql (postgresql 7.4.2) par Gerald Salin, le 07/10/05
Pre-Requis : installation du langage plpgsql dans la base ou sera utilisee la fonction
on peut appeler la fonction par la commande : select text2code128('input') */
DECLARE
ind integer
; /* Indice d avancement dans la chaine de caractere */
chaine ALIAS FOR
$1
; /*recuperation de l argument dans une variable*/
longueur integer
; /* longueur de la chaine passee en argument */
checksum
integer
; /* Caractere de verification de la chaine codee */
mini integer
; /* nbr de caracteres numeriques en suivant */
dummy integer
; /* Traitement de 2 caracteres a la fois */
tableB BOOLEAN
; /* Booleen pour verifier si on doit utiliser la table B du code 128 */
code128 text
; /* code 128 de l argument */
BEGIN
ind:=
1
;
code128 :=
''
;
longueur :=
LENGTH
(
chaine)
; /* recupere la longueur de la chaine passee en argument */
IF
longueur &
lt; 1
THEN
RAISE
EXCEPTION
' Argument Absent!!!'
;
ELSE
FOR
ind IN
1
.. longueur --test de la validite des caracteres composant l argument LOOP
IF
(
ASCII
(
SUBSTR
(
chaine, ind, 1
))
&
lt; 32
)
OR
(
ASCII
(
SUBSTR
(
chaine, ind, 1
))
>
126
)
THEN
RAISE
EXCEPTION
' Argument invalide!!!'
;
END
IF
;
END
LOOP
;
END
IF
;
tableB :=
TRUE
;
WHILE
ind &
lt;=
longueur LOOP
IF
(
tableB =
TRUE
)
THEN
--Voir si c'est interessant de passer en table C
--Oui pour 4 chiffres au debut ou a la fin, sinon pour 6 chiffres
IF
((
ind =
1
)
OR
(
ind+
3
=
longueur))
THEN
mini :=
4
;
ELSE
mini :=
6
;
END
IF
;
--TestNum : si les mini caracteres a partir de ind son numeriques, alors mini = 0
mini :=
mini-
1
;
IF
((
ind +
mini)
&
lt;=
longueur)
THEN
WHILE
mini >=
0
LOOP
IF
(
ASCII
(
SUBSTR
(
chaine, ind+
mini , 1
))
&
lt; 48
)
OR
(
ASCII
(
SUBSTR
(
chaine, ind+
mini, 1
))
>
57
)
THEN
EXIT
;
END
IF
;
mini :=
mini-
1
;
END
LOOP
;
END
IF
;
--Si mini < 0 on passe en table C
IF
(
mini &
lt; 0
)
THEN
IF
(
ind =
1
)
THEN
--Debuter sur la table C
code128 :=
CHR
(
205
)
;
ELSE
--Commuter sur la table C
code128 :=
code128 ||
CHR
(
199
)
;
END
IF
;
tableB :=
FALSE
;
ELSE
IF
(
ind =
1
)
THEN
--Debuter sur la table B
code128 :=
CHR
(
204
)
;
END
IF
;
END
IF
;
END
IF
;
IF
(
tableB =
FALSE
)
THEN
--On est sur la table C, on va essayer de traiter 2 chiffres
mini :=
2
;
mini :=
mini-
1
;
IF
(
ind +
mini &
lt;=
longueur)
THEN
WHILE
mini >=
0
LOOP
IF
(
ASCII
(
SUBSTR
(
chaine, ind+
mini , 1
))
&
lt; 48
)
OR
(
ASCII
(
SUBSTR
(
chaine, ind+
mini, 1
))
>
57
)
THEN
EXIT
;
END
IF
;
mini :=
mini-
1
;
END
LOOP
;
END
IF
;
IF
(
mini &
lt; 0
)
THEN
--OK Pour 2 chiffres, les traiter
dummy :=
SUBSTR
(
chaine, ind, 2
)
::integer
;
IF
(
dummy &
lt; 95
)
THEN
dummy :=
dummy +
32
;
ELSE
dummy :=
dummy +
100
;
END
IF
;
code128 :=
code128 ||
CHR
(
dummy)
;
ind :=
ind +
2
;
ELSE
--On a pas deux chiffres, retourner en table B
code128 :=
code128 ||
CHR
(
200
)
;
tableB :=
TRUE
;
END
IF
;
END
IF
;
IF
(
tableB =
TRUE
)
THEN
code128 :=
code128 ||
SUBSTR
(
chaine, ind, 1
)
;
ind :=
ind +
1
;
END
IF
;
END
LOOP
;
--Calcul de la clef de controle
FOR
ind IN
1
.. LENGTH
(
code128)
LOOP
dummy :=
ASCII
(
SUBSTR
(
code128, ind, 1
))
;
IF
(
dummy &
lt; 127
)
THEN
dummy :=
dummy -
32
;
ELSE
dummy :=
dummy -
100
;
END
IF
;
IF
(
ind =
1
)
THEN
checksum
:=
dummy;
END
IF
;
checksum
:=
mod
(
checksum
+
(
ind-
1
)
*
dummy, 103
)
;
END
LOOP
;
--Calcul du code ascii de la clef de controle
IF
(
checksum
&
lt; 95
)
THEN
checksum
:=
checksum
+
32
;
ELSE
checksum
:=
checksum
+
100
;
END
IF
;
--Ajout de la clef et du STOP a la fin de la chaine codée
code128 :=
code128 ||
CHR
(
checksum
)
||
CHR
(
206
)
;
RETURN
code128;
END
;
$body
$
LANGUAGE
'plpgsql'
VOLATILE RETURNS
NULL
ON
NULL
INPUT SECURITY
INVOKER
;