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

DB2 Discussion :

fonction SQL convertir char en dec


Sujet :

DB2

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 42
    Par défaut fonction SQL convertir char en dec
    Bonjour à tous
    j'ai fais la fonction suivante:
    create function jim/fconvcal2(cal char(12))
    returns dec(8)
    language sql
    deterministic
    disallow parallel
    no external action
    Returns Null on Null Input
    return
    cast (substr (cal, 7, 4) concat
    substr(cal, 3, 2) concat
    substr(cal, 1, 2) as dec(8))
    c'est une fonction qui prend en entré un char(10)
    dd-mm-yyyy et me le converti en dec(8) yyyymmdd
    pourtant lors de l'exécution j'ai le message d'erreur

    SQL0204] FCONVCAL2 de type *N dans JOEL non trouvé

    J'ai déjà cherché mais je ne vois pas trop où j'aurais put faire mon erreur, si vous avez une idée je vous en saurais reconnaissant

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    Plusieurs raisons possibles.
    Soit ta liste de bibliothquès n'est pas bonne, convention *SYS.
    Sinon le plus probable, tu dois être en train de tester ta fonction avec une constante.
    ex :
    select fconvcal2('123456789012') from sysibm/sysdummy1

    Etant donné que ta fonction recoit un CHAR, tu ne peux envoyer de constante, il la considère comme un VARCHAR.

    Avec un
    select fconvcal2(char('123456789012')) from sysibm/sysdummy1
    celà devrait marcher.

    Le mieux est de créer ta fonction en déclarant un VARCHAR plutôt qu'un CHAR, comme ça, que tu envoies un CHAR ou un VARCHAR, les deux marcheront.

    Considérations sur les fonctions
    • Plusieurs fonctions peuvent porter le même nom
    • DB2 déterminera celle à utiliser à l'aide de :
    - la signature (unique dans une bibliothèque), composée du nom de la fonction et du type des paramètres
    — la longueur des paramètres et le type de la valeur retournée ne sont pas pris en compte
    — par exemple, monUDF(CHAR(5)) et monUDF(DEC(5, 2) peuvent exister dans la même bibliothèque
    - le chemin, *LIBL si NAMING(*SYS) ou QSYS QSYS2 profil si NAMING(*SQL)
    Dans le cas de la convention d'appellation *SQL, on peut changer le chemin par l'instruction SET PATH , avec SYSTEM PATH représentant symboliquement QSYS
    QSYS2 (par défaut en tête)
    Exemple :SET PATH SQLLAB AS425F ---> QSYS QSYS2 SQLLAB AS425F
    SET PATH AS425F SYSTEM PATH ---> AS425F QSYS QSYS2

    - On peut utiliser un nom qualifié en NAMING(*SQL), mais pas en NAMING(*SYS)

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    En plus de ce que t'as dit K2R400, j'ai relevé les points suivants.

    1/ Le substring sur le return est faux : il faut que tu corriges comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    return
    cast (substr (cal, 7, 4) concat
    substr(cal, 4, 2) concat
    substr(cal, 1, 2) as dec(8));
    2/ Si ça t'intéresse de contrôler la date pour savoir si elle est erronée, tu peux la signaler et poursuivre le traitement comme l'illustre ta fonction après retouches ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     Drop Function FCONVCAL2;                          
     CREATE FUNCTION FCONVCAL2(DDMMYYYY VARCHAR(10))   
     RETURNS DEC(8)                                    
     LANGUAGE SQL                                      
     DETERMINISTIC                                     
     DISALLOW PARALLEL                                 
     NO EXTERNAL ACTION                                
     RETURNS NULL ON NULL INPUT                        
     SET OPTION DATFMT = *ISO                                  
     Begin                                                     
        Declare DtAlpha char( 10 );                            
        Declare DtISO Date;                                    
        Declare EXIT HANDLER For SQLException                  
            Return Cast( 99991231 As Dec( 8 ) );               
        Set DtAlpha= Substr( DDMMYYYY, 7, 4 ) Concat '-' Concat
                     Substr( DDMMYYYY, 4, 2 ) Concat '-' Concat
                     Substr( DDMMYYYY, 1, 2);                  
        Set  DtISO = DtAlpha;                                  
        RETURN CAST (SUBSTR (DDMMYYYY, 7, 4) CONCAT            
                     SUBSTR (DDMMYYYY, 4, 2) CONCAT            
                     SUBSTR (DDMMYYYY, 1, 2) AS DEC(8)) ;      
     End
    Si la date à convertir est erronée, le
    déclenchera l'EXIT HANDLER indiqué qui te renverra alors la date à la valeur 99991231 mais cette anomalie n'arretera pas le traitement.
    Quand le traitement sera terminé, tu pourras facilement retrouver les enreg. concernés avec une instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select ... Where MaDate = 99991231

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 42
    Par défaut
    Trop Top ça maaaaaaaaaaaaaarcheeeeeeeeeeee
    en fait j'ai eu besoin de vos 2 réponses un énorme merci
    trop top

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PL / SQL] Convertir chaine en tableau de char
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 06/02/2006, 10h29
  2. [SQL] Convertir un champ INT en CHAR dans un SELECT ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/03/2005, 14h45
  3. [Fonction Oracle] Convertir des secondes en heure
    Par falcon dans le forum Oracle
    Réponses: 12
    Dernier message: 18/11/2004, 11h56
  4. [Fonction SQL Server] Convertir des secondes en heure
    Par falcon dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 17/11/2004, 17h22
  5. fonction sql "LIMIT" en interbase?
    Par GMI dans le forum InterBase
    Réponses: 6
    Dernier message: 20/09/2004, 14h04

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