IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Adaptive Server Enterprise Sybase Discussion :

Créer une fonction dans sybase


Sujet :

Adaptive Server Enterprise Sybase

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 108
    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

  2. #2
    Invité
    Invité(e)
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    exec proc param1 param2

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 108
    Par défaut
    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

  5. #5
    Membre éprouvé
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Par défaut
    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..).

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 108
    Par défaut
    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é.

  7. #7
    Membre éprouvé
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Par défaut
    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:

    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)

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Par défaut
    On apprend de nouvelles choses tous les jours... je n'étais pas du tout au courant de cette fonction!

    Merci,

    Michael

  9. #9
    Membre éprouvé
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Par défaut
    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...

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 108
    Par défaut
    Roller,

    T'es un AS .

    Merci beaucoup!

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 108
    Par défaut
    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

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Par défaut
    Essaye ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  13. #13
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 108
    Par défaut
    mpeppler,

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

    Ex.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select charindex(bintostr(sortkey('bc', 54)), bintostr(sortkey('ab cd', 54)))
    retourne 5, alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select charindex(bintostr(sortkey('b c', 54)), bintostr(sortkey('ab cd', 54)))
    retourne 0

    Une autre idée?

    Merci pour ton aide

  14. #14
    Membre éprouvé
    Inscrit en
    Août 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 134
    Par défaut
    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).

  15. #15
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 108
    Par défaut
    merci pour votre aide


Discussions similaires

  1. Comment créer une fonction dans OpenERP
    Par Boubaker Abdallah dans le forum Odoo (ex-OpenERP)
    Réponses: 7
    Dernier message: 27/04/2014, 23h34
  2. Créer une fonction appelée dans le contrôleur
    Par cissou06 dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 13/02/2008, 11h08
  3. Créer une fonction dans une fonction
    Par chris81 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 20/12/2007, 15h50
  4. comment créer une fonction dans un activex
    Par barhoom dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 11/03/2007, 18h19
  5. Créer dynamiquement une fonction dans une procedure
    Par cbon1 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/10/2006, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo