Précédent   Forum des professionnels en informatique > Bases de données > Sybase > Adaptive Server Enterprise
Adaptive Server Enterprise Forum d'entraide concernant Sybase Adaptive Server Enterprise, le dataserver phare de Sybase
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/08/2008, 16h28   #1
Membre du Club
 
Inscription : octobre 2002
Messages : 108
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 108
Points : 68
Points : 68
Par défaut Créer une fonction dans sybase

Bonjour,

Je voudrais créer une fonction qui va être utilisée dans les requêtes.

Par exemple : select col1, col2 from table1 where ma_fonction(col3) = ...

Vu dans la doc de Sybase http://infocenter.sybase.com/help/in...s/blocks73.htm, il me semble qu'on ne peut pas créer de fonction mais que des procédures. Mais comment utiliser les procédures dans les requêtes sql? J'ai essayé SELECT ma_procedure(col)... mais ça ne marche pas .

Si quelqu'un a déjà résolu le même type de problème, je suis preneur.

Merci
trungsi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 17h10   #2
Membre à l'essai
 
Inscription : juin 2007
Messages : 65
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 65
Points : 20
Points : 20
Envoyer un message via MSN à maillaxa
Citation:
Envoyé par trungsi Voir le message
Bonjour,

Je voudrais créer une fonction qui va être utilisée dans les requêtes.

Par exemple : select col1, col2 from table1 where ma_fonction(col3) = ...

Vu dans la doc de Sybase http://infocenter.sybase.com/help/in...s/blocks73.htm, il me semble qu'on ne peut pas créer de fonction mais que des procédures. Mais comment utiliser les procédures dans les requêtes sql? J'ai essayé SELECT ma_procedure(col)... mais ça ne marche pas .

Si quelqu'un a déjà résolu le même type de problème, je suis preneur.

Merci
Pour appeler une proc, il faut tout simplement faire un:

Code :
exec proc param1 param2
maillaxa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 17h33   #3
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
Premièrement, quelle version d'ASE?

Si il s'agit de 15.0.2 ou plus récent, alors on peut écrire de vrai fonctions en T-SQL - par example:

Code :
1
2
3
4
5
6
7
8
9
 
CREATE FUNCTION my_max(@id1 int, @id2 int)
returns int
AS
  RETURN case when @id1 > @id2 then @id1 else @id2 end
go
 
SELECT dbo.my_max(1, 2)
go
Si tu n'es pas en 15.0.2 - on peut créer des fonctions en java (ce que je n'ai jamais fait...)
Autrement - ce sont des procs stockées, qui ne sont pas appelables en ligne dans un SELECT.

Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 18h33   #4
Membre du Club
 
Inscription : octobre 2002
Messages : 108
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 108
Points : 68
Points : 68
ASE 12.5.3 .

Je vais donc "inliner" toute la logic de ma fonction dans les requêtes SQL. Car c'est encore possible. Tant pis pour la "readabilité".

En fait, ce que je voudrais faire est la recherche sans prise en compte des caractères non accentués. Ma solution sera une grande chaine de str_replace().

Si quelqu'un a une meilleure solution, je suis toujours preneur
trungsi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 20h21   #5
Membre actif
 
Inscription : août 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 134
Points : 152
Points : 152
Tu peux utiliser la fonction T-SQL upper() ou changer le character set de ton serveur (je te déconseille la dernière solution, trop risquée..).
Roller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2008, 10h30   #6
Membre du Club
 
Inscription : octobre 2002
Messages : 108
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 108
Points : 68
Points : 68
Roller,

upper() ne marche pas. Il y a des caractères accentués en majuscule.

La deuxième solution n'est pas envisageable car j'ai pas la main sur le serveur. Et comme tu dis, c'est risqué.
trungsi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2008, 11h42   #7
Membre actif
 
Inscription : août 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 134
Points : 152
Points : 152
My bad, j'avais mal lu, je croyais que tu voulais que tu voulais ignorer la casse.
Pour les accents, tu peux utiliser la fonction compare:

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc36271_36272_36273_36274_1250/html/refman/X14054.htm

Exemple:

Citation:
sa@PARTST.master.1# select compare('testé','tesTe',54);

-----------
0

(1 row affected)

sa@PARTST.master.1# select compare('testi','teste',54);

-----------
1

(1 row affected)
Roller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2008, 11h57   #8
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
On apprend de nouvelles choses tous les jours... je n'étais pas du tout au courant de cette fonction!

Merci,

Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2008, 13h22   #9
Membre actif
 
Inscription : août 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 134
Points : 152
Points : 152
Et pour poursuivre sur ma lancée, on peut aussi trier selon un charset différent avec la fonction sortkey:

http://infocenter.sybase.com/help/in...man/X14054.htm

Enfin je préfère quand même le collate de Ms SQL Server...
Roller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2008, 14h21   #10
Membre du Club
 
Inscription : octobre 2002
Messages : 108
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 108
Points : 68
Points : 68
Roller,

T'es un AS .

Merci beaucoup!
trungsi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2008, 18h07   #11
Membre du Club
 
Inscription : octobre 2002
Messages : 108
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 108
Points : 68
Points : 68
J'aurais encore besoin de votre aide car j'arrive pas encore à résoudre complètement le problème de recherche sans accent .

Suite à la suggestion de Roller, j'utilise la fonction sortkey pour implémenter cette fonctionnalité.

E.g : select * from table where SORTKEY(col, 54) like '%' + SORTKEY(valeur_recherche, 54) + '%'

Ca ne marche que si valeur_recherche ne contient pas ni d'espaces, ni de symboles ou de caractères de ponctuation.

J'ai essayé toutes les options de la table de collation mais sans succès .

Je me demande si quelqu'un connait une autre fonction magique de Sybase ?

Merci
trungsi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2008, 08h39   #12
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
Essaye ceci:

Code :
1
2
 
SELECT * FROM TABLE WHERE bintostr(SORTKEY(col, 54)) LIKE '%' + bintostr(SORTKEY(valeur_recherche, 54)) + '%'
sortkey() retourne une chaine binaire - il faut convertir cette chaine en char (via bintostr()) pour pouvoir utiliser des fonctions style like, etc.

Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2008, 10h33   #13
Membre du Club
 
Inscription : octobre 2002
Messages : 108
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 108
Points : 68
Points : 68
mpeppler,

Ca permet tjs pas de résoudre mon problème.

Ex.

Code :
1
2
3
4
 
SELECT bintostr(sortkey('ab', 54)), bintostr(sortkey('cd', 54)), bintostr(sortkey('b c', 54)), bintostr(sortkey('ab cd', 54));
 
08610875	08890895	087508890001fffe0020	08610875088908950001fffd0020
On voit que 'ab' et 'cd' se trouvent dans 'ab cd' mais pas 'b c'. J'ai l'impression que la fonction SORTKEY enlève les espaces (et d'autres caratères non alpha-numériques) de la chaine originale et les remet à la fin.

Ex.

Code :
1
2
 
SELECT charindex(bintostr(sortkey('bc', 54)), bintostr(sortkey('ab cd', 54)))
retourne 5, alors
Code :
1
2
 
SELECT charindex(bintostr(sortkey('b c', 54)), bintostr(sortkey('ab cd', 54)))
retourne 0

Une autre idée?

Merci pour ton aide
trungsi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2008, 11h13   #14
Membre actif
 
Inscription : août 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 134
Points : 152
Points : 152
C'est normal, sortkey est fait pour être utilisé lors d'un tri, et ignore donc les caractères non pris en compte dans un tri.
Je pense que ce que tu cherches à faire est impossible avec ton charset sans une procédure/du code T-SQL qui te permette d'enlever les accents (ou une modification du programme qui utilise ce code pour qu'il enlève lui-même les accents).
Roller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2008, 12h22   #15
Membre du Club
 
Inscription : octobre 2002
Messages : 108
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 108
Points : 68
Points : 68
merci pour votre aide

trungsi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h11.


 
 
 
 
Partenaires

Hébergement Web