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

SQL*Loader Oracle Discussion :

Erreur : Expecting "," or ")", found "NUMBER"


Sujet :

SQL*Loader Oracle

  1. #1
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut Erreur : Expecting "," or ")", found "NUMBER"
    Bonjour,

    lorsque je tente d'éxecuter SQl*Loader j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SQL*Loader-350: Syntax error at line 7.
    Expecting "," or ")", found "NUMBER".
     "TAUPER" NUMBER,          
              ^
    Et voici mon fichier de contrôle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    LOAD DATA INFILE '${PWD}/../out/RF_PER.csv'
    TRUNCATE
    INTO TABLE RF_PER 
    FIELDS TERMINATED BY ';'
    TRAILING NULLCOLS
    (PK_DE_PER "SQ_RF_SRV.NEXTVAL",
     TAUPER NUMBER,          
     DATCRE DATE,
     DATEFF DATE,
     SEN VARCHAR2(1)
    )
    Je ne comprends pas très bien pourquoi l'erreur se produit...

    Si vous avez une idée je suis preneur.

    Merci d'avance

    Dany

  2. #2
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Bonjour,

    Il ne faut pas préciser le type de données (number ou date ou varchar2). SQL*Loader fera des conversions implicites.

  3. #3
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Oui c'est ce que j'avais fais au début, mais j'ai rajouté les types pour pallier à une autre erreur.

    Je viens de retester en enlevant les types, et voici l'erreur retournée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Record 1: Rejected - Error on table RF_PER, column TAUPER.
    ORA-01722: invalid number
    Voici les données que je tente d'insérer :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
     
    1.16023;24/08/06;01/09/06;V
    1.1608;26/09/06;01/10/06;V
    1.16203;29/03/05;01/04/05;V
    1.20233;29/09/05;01/10/05;V
    1.13421;28/03/07;01/04/07;V
    1.20316;28/10/05;01/11/05;V
    1.07773;27/11/07;01/12/07;V
    1.16201;28/04/05;01/05/05;V
    1.12753;22/10/08;23/10/08;V
    1.5104;27/02/01;01/03/01;H
    1.09001;27/12/94;01/01/95;V
    1.20786;07/05/97;12/05/97;V
    1.21315;27/05/97;01/06/97;V
    1.23332;26/06/97;01/07/97;V
    1.28688;27/07/97;01/08/97;V
    1.26921;27/08/97;01/09/97;V
    1.24703;26/09/97;01/10/97;V
    1.23636;27/10/97;01/11/97;V
    1.22264;26/11/97;01/12/97;V
    1.22721;27/12/97;01/01/98;V
    1.24246;27/01/98;01/02/98;V
    1.25313;24/02/98;01/03/98;V
    1.25466;27/03/98;01/04/98;V
    1.23636;26/04/98;01/05/98;V
    1.21045;27/05/98;01/06/98;V
    1.22788;26/06/98;01/07/98;V
    1.21916;27/07/98;01/08/98;V
    1.21919;27/08/98;01/09/98;V
    1.18144;27/09/98;02/10/98;V
    1.18194;27/10/98;01/11/98;V
    1.2079;26/11/98;01/12/98;V
    1.20174;27/12/98;01/01/99;V
    1.21171;27/01/99;01/02/99;V
    1.24229;24/02/99;01/03/99;V
    1.2537;27/03/99;01/04/99;V
    1.27258;02/05/99;07/05/99;V
    1.27074;27/05/99;01/06/99;V
    1.29721;26/06/99;01/07/99;V
    1.28796;06/08/99;11/08/99;V
    1.29199;27/08/99;01/09/99;V
    1.32522;26/09/99;01/10/99;V
    1.29679;27/10/99;01/11/99;V
    1.33381;26/11/99;01/12/99;V
    1.36214;27/12/99;01/01/00;V
    1.35874;27/01/00;01/02/00;V
    1.34037;25/02/00;01/03/00;V
    1.38698;27/03/00;01/04/00;V
    1.42719;26/04/00;01/05/00;V
    1.44031;27/05/00;01/06/00;V
    1.41363;26/06/00;01/07/00;V
    1.41047;27/07/00;01/08/00;V
    1.46393;27/08/00;01/09/00;V
    1.45831;26/09/00;01/10/00;V
    1.52722;27/10/00;01/11/00;V
    1.51079;26/11/00;01/12/00;V
    1.412;27/12/00;01/01/01;V
    1.38403;27/01/01;01/02/01;V
    1.41724;24/02/01;01/03/01;V
    1.41571;26/04/01;01/05/01;V
    1.42233;27/03/01;01/04/01;V
    1.46318;27/05/01;01/06/01;V
    1.46432;26/06/01;01/07/01;V
    1.44881;27/07/01;01/08/01;V
    1.40627;27/08/01;01/09/01;V
    1.40478;26/09/01;01/10/01;V
    1.42481;27/10/01;01/11/01;V
    1.43129;26/11/01;01/12/01;V
    1.41155;27/12/01;01/01/02;V
    1.41345;27/01/02;01/02/02;V
    1.42315;24/02/02;01/03/02;V
    1.42204;27/03/02;01/04/02;V
    1.41865;26/04/02;01/05/02;V
    1.39178;27/05/02;01/06/02;V
    1.35604;26/06/02;01/07/02;V
    1.34357;27/07/02;01/08/02;V
    1.35524;27/08/02;01/09/02;V
    1.3428;26/09/02;01/10/02;V
    1.34445;27/10/02;01/11/02;V
    1.32737;26/11/02;01/12/02;V
    1.31104;27/12/02;01/01/03;V
    1.27577;27/01/03;01/02/03;V
    1.26684;24/02/03;01/03/03;V
    1.28172;27/03/03;01/04/03;V
    1.25443;26/04/03;01/05/03;V
    1.2047;27/05/03;01/06/03;V
    1.22152;26/06/03;01/07/03;V
    1.22533;27/07/03;01/08/03;V
    1.26225;27/08/03;01/09/03;V
    1.23673;26/09/03;01/10/03;V
    1.21913;27/10/03;01/11/03;V
    1.21298;26/11/03;01/12/03;V
    1.18992;27/12/03;01/01/04;V
    1.18169;27/01/04;01/02/04;V
    1.18371;25/02/04;01/03/04;V
    1.20452;25/03/04;01/04/04;V
    1.22137;27/04/04;01/05/04;V
    1.20864;27/05/04;01/06/04;V
    1.18194;27/10/04;01/11/04;V
    1.21054;28/06/04;01/07/04;V
    1.20309;27/07/04;01/08/04;V
    1.19964;27/08/04;01/09/04;V
    1.19271;27/09/04;01/10/04;V
    1.16207;26/11/04;01/12/04;V
    1.14534;27/12/04;01/01/05;V
    1.16913;27/01/05;01/02/05;V
    1.15361;28/11/06;01/12/06;V
    1.15738;25/02/05;01/03/05;V
    1.1981;29/08/05;01/09/05;V
    1.16327;29/05/06;01/06/06;V
    1.03756;26/05/08;01/06/08;V
    1.18436;25/05/05;01/06/05;V
    1.06478;27/08/08;01/09/08;V
    1.21329;27/06/05;01/07/05;V
    1.07072;25/02/08;01/03/08;V
    1.19866;28/07/05;01/08/05;V
    1.20982;29/11/05;01/12/05;V
    1.2078;26/12/05;01/01/06;V
    1.1221;28/05/07;01/06/07;V
    1.18708;27/01/06;01/02/06;V
    1.17076;25/10/06;01/11/06;V
    1.1406;27/02/07;01/03/07;V
    1.0415;25/06/08;01/07/08;V
    1.20229;27/02/06;01/03/06;V
    1.19502;27/03/06;01/04/06;V
    1.1811;25/04/06;01/05/06;V
    1.16511;29/10/08;01/11/08;V
    1.17509;28/06/06;01/07/06;V
    1.14144;27/12/06;01/01/07;V
    1.12424;28/06/07;01/07/07;V
    1.09413;29/10/07;01/11/07;V
    1.16574;26/07/06;01/08/06;V
    1.14808;26/01/07;01/02/07;V
    1.12378;25/04/07;01/05/07;V
    1.10286;27/09/07;01/10/07;V
    1.1112;27/07/07;01/08/07;V
    1.12527;27/08/07;01/09/07;V
    1.0868;26/12/07;01/01/08;V
    1.08403;28/01/08;01/02/08;V
    1.05623;27/03/08;01/04/08;V
    1.03158;25/04/08;01/05/08;V
    1.03441;25/07/08;01/08/08;V
    1.0731;26/09/08;01/10/08;V
    et voici le type de données de la colonne TAUPER :

    Les données ont l'air de corresponde au format de la colonne, donc je ne comprends pas pourquoi l'insertion des données de passe pas

  4. #4
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    C'est peut-être ta première pseudo-colonne dans laquelle tu utilise une séquence qui provoque un décalage dans la lecture des colonnes. Il essaye de mettre "24/08/06" dans la colonne TAUPER.
    Peux-tu essayer sans mettre la ligne "PK_DE_PER "SQ_RF_SRV.NEXTVAL"" ?

    Si ça ne fonctionne toujours pas, alors c'est probablement le séparateur de décimal "." qu'il n'interprète pas bien. Dans ce cas, il faut ajouter une conversion explicite "TO_CHAR(...)".

  5. #5
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    La première solution ne fonctionne pas.

    Je n'ai pas bien compris la 2ème, où est-ce que je dois mettre TO_CHAR(...) ?

    Merci de ton aide

  6. #6
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Au temps pour moi, je voulais dire "TO_NUMBER".
    Ca donne le fichier de contrôle suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    LOAD DATA INFILE '${PWD}/../out/RF_PER.csv'
    TRUNCATE
    INTO TABLE RF_PER 
    FIELDS TERMINATED BY ';'
    TRAILING NULLCOLS
    (PK_DE_PER "SQ_RF_SRV.NEXTVAL",
     TAUPER "to_number(:tauper, '999999.9999999999')",          
     DATCRE "to_date(:datcre, 'DD/MM/RR')",
     DATEFF "to_date(:dateff, 'DD/MM/RR')",
     SEN
    )

  7. #7
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Bon ça avance, mais du coup c'est une autre erreur qui apparaît :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Record 1: Rejected - Error on table RF_PER, column SEN.
    ORA-01400: cannot insert NULL into (SEN)
    Ce qui est bizarre c'est que je n'ai jamais de valeur nulle dans la colonne SEN dans le fichier CSV...

    As-tu une idée ?

  8. #8
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Déplace la ligne avec la séquence en dernière position.

  9. #9
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Cela génère une erreur.

    Lorsque je ne mets pas "TRAILING NULLCOLS" dans le fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Record 1: Rejected - Error on table RF_PER, column PK_DE_PER.
    Column not found before end of logical record (use TRAILING NULLCOLS)
    et quand je le mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Record 1: Rejected - Error on table RF_PER.
    ORA-00604: error occurred at recursive SQL level 1
    ORA-01400: cannot insert NULL into ("PREVALO5"."RF_PER"."PK_DE_PER")
    Désolé d'abuser de ton temps mais je suis un gros newbie en SQL*Loader donc c'est compliqué de deviner par moi même la façon de corriger les erreurs

  10. #10
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    J'ai fait le test suivant.
    Ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> desc xde;
     Nom                                       NULL ?   Type
     ----------------------------------------- -------- ----------------------------
     TAUPER                                             NUMBER
     DATCRE                                             DATE
     DATEFF                                             DATE
     SEN                                                VARCHAR2(1)
     NUM_SEQ                                            NUMBER
    Une séquence xde_s
    Mon fichier de controle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    LOAD DATA INFILE '/tmp/xde.txt'
    TRUNCATE
    INTO TABLE xde
    FIELDS TERMINATED BY ';'
    TRAILING NULLCOLS
    (
     TAUPER "to_number(:tauper, '999999.9999999999')",
     DATCRE "to_date(:datcre, 'DD/MM/RR')",
     DATEFF "to_date(:dateff, 'DD/MM/RR')",
     SEN ,
     num_seq "xde_s.nextval"
    )
    Le fichier que tu as donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ more /tmp/xde.txt
    1.16023;24/08/06;01/09/06;V
    1.1608;26/09/06;01/10/06;V
    1.16203;29/03/05;01/04/05;V
    1.20233;29/09/05;01/10/05;V
    1.13421;28/03/07;01/04/07;V
    1.20316;28/10/05;01/11/05;V
    1.07773;27/11/07;01/12/07;V
    1.16201;28/04/05;01/05/05;V
    1.12753;22/10/08;23/10/08;V
    1.5104;27/02/01;01/03/01;H
    1.09001;27/12/94;01/01/95;V
    1.0731;26/09/08;01/10/08;V
    La ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlldr userid=my_user/my_pw control=/tmp/xde.ctl
    Tout se déroule correctement et je retrouve les donées dans ma table:
    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
    SQL> select * from xde;
     
        TAUPER DATCRE   DATEFF   S    NUM_SEQ
    ---------- -------- -------- - ----------
       1,16023 24/08/06 01/09/06 V         52
        1,1608 26/09/06 01/10/06 V         53
       1,16203 29/03/05 01/04/05 V         54
       1,20233 29/09/05 01/10/05 V         55
       1,13421 28/03/07 01/04/07 V         56
       1,20316 28/10/05 01/11/05 V         57
       1,07773 27/11/07 01/12/07 V         58
       1,16201 28/04/05 01/05/05 V         59
       1,12753 22/10/08 23/10/08 V         60
        1,5104 27/02/01 01/03/01 H         61
       1,09001 27/12/94 01/01/95 V         62
        1,0731 26/09/08 01/10/08 V         63
     
    12 ligne(s) sélectionnée(s).
    J'ai dû louper qq chose par rapport à ce que tu fais. Essaye de voir les différences ou de poster le détail de tout ce que tu fais.

  11. #11
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Salut,

    Tous mes champs dans la table sont "NOT NULL", c'est peut-être là la différence. Peux-tu essayer de refaire ton test pour voir si tu retombes sur la même erreur que moi ?

    Merci encore

  12. #12
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Bonjour,

    J'ai passé ma table avec tous les chmaps NOT NULL => pas de problème.
    Tu as bien reproduit toutes les étapes exactement comme moi ?

  13. #13
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Y'a qu'un seul bout de code que je ne t'ai pas fais voir et c'est celui-là qui faisait la différence ! C'est l'appel du SQL Loader :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlldr userid=$ROA_USER_ORA@$ROA_DB_ORA/$ROA_MDP_ORA control=${SAS_CTL}${1}.ctl log=log/${1}.sqlldrlog bad=log/${1}.bad discard=log/${1}.discard direct=y errors=0
    Le mode direct=y n’est pas compatible avec la génération d’une séquence dans le fichier de contrôle. Il suffisait de mettre direct=n.

    En tout cas merci de ton aide tu m'as bien fais avancer sur le création de mon fichier de contrôle.

    Bonne journée

    Dany

  14. #14
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    OK, content que ça fonctionne !

    Xavier

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

Discussions similaires

  1. erreur: expected unqualified-id
    Par Le Barde dans le forum C++
    Réponses: 3
    Dernier message: 11/07/2007, 16h50
  2. Réponses: 5
    Dernier message: 13/03/2006, 16h51

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