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

Oracle Discussion :

ora-01722


Sujet :

Oracle

Vue hybride

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 41
    Par défaut ora-01722
    Bonjour,

    Je travail sous Oracle 8.1.7.4.0 et j'ai un p'tit souci

    J'execute du sql via dbms .... tout marche bien

    sColumn VARCHAR2(100):='';

    DBMS_SQL.PARSE(cid1, sSelect2, dbms_sql.native);
    DBMS_SQL.DEFINE_COLUMN_CHAR(cid1, 1, sColumn, 100);
    DBMS_SQL.EXECUTE_AND_FETCH(cid1, TRUE);
    DBMS_SQL.COLUMN_VALUE_CHAR(cid1, 1, sColumn);

    Dans la base, la valeur extraite correspond au type varchar2 bien qu'elle est typiquement numérique.
    plus concraitement, dans mon test sColumn correspond à 13000 alors qu'elle doit être '13000'

    Comment faire afin d'utiliser sColumn comme varchar2 et éviter de tomber dans l'erreur ora-01722 dans les traitements ultérieurs.

    Merci


    Youssef Ssec

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Dans la base, la valeur extraite correspond au type varchar2 bien qu'elle est typiquement numérique.
    plus concraitement, dans mon test sColumn correspond à 13000 alors qu'elle doit être '13000'
    Je ne comprends pas: la colonne est un VARCHAR2 ou NUMBER/INTEGER/... ?

    Pouvez-vous nous préciser la structure complète de la table et la requête du curseur ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 41
    Par défaut
    sColumn VARCHAR2(100):='';
    lProcessedRows int := '';

    -- ma requette est du genre

    sSelect2 = Select product FROM TABLE_CO WHERE OBJID=12;

    -- avec product de type varchar2

    cid1 := DBMS_SQL.OPEN_CURSOR;


    DBMS_SQL.PARSE(cid1, sSelect2, dbms_sql.native);
    DBMS_SQL.DEFINE_COLUMN_CHAR(cid1, 1, sColumn, 100);
    DBMS_SQL.EXECUTE_AND_FETCH(cid1, TRUE);
    DBMS_SQL.COLUMN_VALUE_CHAR(cid1, 1, sColumn);

    --- après j'ai besoin de la valeur de sColumn pour cette requette
    --- sachat que la colone PARTNUM est de type varchar2 aussi

    SELECT COUNT(*) INTO lProcessedRows FROM TABLE_X
    WHERE PARTNUM = sColumn;

    --- qui retourne une mauvaise valeur : 0 alors qu'elle doit retourner 1

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 41
    Par défaut
    en fait quand je lance la même requette sous sql cela donne

    SELECT count(*) FROM TABLE_X
    WHERE PARTNUM = '13607'

    j'obtiens la valeur 1.

    --- est cela peut être du au fait que la requette que j'execute de pl/sql est la suivante

    SELECT * FROM TABLE_X
    WHERE PARTNUM = 13607

    --- est ce qu'il y a une fonction pl/sql qui permet de retourner le type d'une variable ??
    merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 41
    Par défaut
    ltrim(rtrim(sColumn))

    je suis désolé pour le dérangement

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Je n'arrive pas à reproduire votre problème en 8.1.7.4.
    D'abord DBMS_SQL.EXECUTE_AND_FETCH n'existe pas sur ma base :
    Et le code suivant:
    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
     
     
    drop table table_co;
     
    create table  table_co (objid NUMBER, product VARCHAR2(100));
     
    insert into table_co values(12, '13000');
    commit;
     
    set serveroutput on;
     
    DECLARE
    sColumn VARCHAR2(100):=''; 
    cid1 INTEGER;
    rc INTEGER;
    nb INTEGER;
    sSelect2 VARCHAR2(500):=NULL;
    BEGIN
    sSelect2 := ' Select product FROM TABLE_CO WHERE OBJID=12';
    cid1 := DBMS_SQL.OPEN_CURSOR; 
    DBMS_SQL.PARSE(cid1, sSelect2, dbms_sql.native); 
    DBMS_SQL.DEFINE_COLUMN_CHAR(cid1, 1, sColumn, 100); 
    -- DBMS_SQL.EXECUTE_AND_FETCH(cid1, TRUE);
    rc := DBMS_SQL.EXECUTE(cid1); 
    nb := DBMS_SQL.FETCH_ROWS(cid1);
    DBMS_SQL.COLUMN_VALUE_CHAR(cid1, 1, sColumn);
    dbms_output.put_line('Scolumn=' || Scolumn);
    END;
    s'exécute sans erreur et retourne le résultat demandé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Table dropped.
    Table created.
    1 row created.
    Commit complete.
    Scolumn=13000                                                                                               
    PL/SQL procedure successfully completed.
    Essayez de réduire votre code et de donner un exemple complet qu'on puisse reproduire sinon on ne peut pas vous aider.

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Citation Envoyé par bouda27
    en fait quand je lance la même requette sous sql cela donne

    SELECT count(*) FROM TABLE_X
    WHERE PARTNUM = '13607'

    j'obtiens la valeur 1.

    --- est cela peut être du au fait que la requette que j'execute de pl/sql est la suivante

    SELECT * FROM TABLE_X
    WHERE PARTNUM = 13607

    --- est ce qu'il y a une fonction pl/sql qui permet de retourner le type d'une variable ??
    merci
    Si PARTNUM est de type numérique et sColumn de type VARCHAR2, vous pouvez utiliser la fonction TO_NUMBER et écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT count(*) FROM TABLE_X
    WHERE PARTNUM = TO_NUMBER(SColumn)
    Sinon effectivement vous pouvez comparer directement avec ltrim(rtrim) si le PARTNUM est aussi VARCHAR2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT count(*) FROM TABLE_X
    WHERE PARTNUM = LTRIM(RTRIM(SColumn))

Discussions similaires

  1. ORA-01722: Nombre non valide + sqlloader
    Par damiano84 dans le forum SQL*Loader
    Réponses: 9
    Dernier message: 20/05/2022, 20h09
  2. ORA-01722: Nombre non valide
    Par misa dans le forum Oracle
    Réponses: 4
    Dernier message: 18/12/2007, 15h23
  3. ORA-01722: soustraction de date avec des nvl
    Par Cofondinde dans le forum Oracle
    Réponses: 3
    Dernier message: 22/02/2007, 14h44
  4. Delphi Et Oracle Ora-01722
    Par sessime dans le forum Bases de données
    Réponses: 14
    Dernier message: 21/01/2007, 14h40
  5. [SQLLDR]ORA-01722: Nombre non valide
    Par syl2095 dans le forum Oracle
    Réponses: 5
    Dernier message: 22/05/2006, 15h42

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