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-06502 sur un delete


Sujet :

Oracle

  1. #1
    DBS
    DBS est déconnecté
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 29
    Points : 8
    Points
    8
    Par défaut ORA-06502 sur un delete
    Bonjour,

    La table B est une copie de la table A (avec moins de lignes). Et je souhaite suprrimer de A tout ce que j'ai copié dans B.

    Je fais du pl/sql dynamic, le code suivant me genere une erreur ORA-06502 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate ' delete from A where (' || ma_chaine_de_colonnes || ') in (select ' ||  ma_chaine_de_colonnes || ' from B)';
    je sais aussi que length(ma_chaine_de_colonnes) = 1271, est-ce beaucoup trop ?

    Merci d'avance pour vos propositions de solution !

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Pourquoi ne pas baser votre requête seulement sur la clé primaire ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  3. #3
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Quel est le message d'erreur complet ? L'erreur 06502 a un texte associé "variable" en fonction de la cause réelle de l'erreur...


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  4. #4
    DBS
    DBS est déconnecté
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 29
    Points : 8
    Points
    8
    Par défaut
    Le message ORA-06502 : erreur numerique ou erreur sur une valeur

    Les tables sont tres anciennes et n'ont pas forcement de cle primaire.

  5. #5
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Avez-vous essayé de valoriser une variable VARCHAR2 et transmettre seulement cette variable à EXECUTE IMMEDIATE ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  6. #6
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Je me demande si certaines colonnes homonymes n'ont pas le même type dans les deux tables d'où des conversions implicites...


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  7. #7
    DBS
    DBS est déconnecté
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 29
    Points : 8
    Points
    8
    Par défaut
    Excusez moi mais je ne saisi pas tres bien ce que vous me suggerez.
    Pourriez-vous m'eclairer un peu plus ?

    En faisant des tests, j'obtiens aussi l'erreur ORA 01722 nombre invalide,
    cela rejoindrait-il une erreur de conversion implicite ?

  8. #8
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Est-ce-que les types des colonnes identiques sont aussi les mêmes ?

    Je pense que l'erreur est peut être due au fait que dans A on ait par exemple une colonne X en NUMBER dans B on a la même colonne en VARCHAR2(10) et contient par exemple 'TOTO'
    Quand Oracle exécute le IN il essaiera de convertir B.X en number pour le comparer à A.X

    Vérifie les types, c'est peut être complètement autre chose.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  9. #9
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Citation Envoyé par DBS
    En faisant des tests, j'obtiens aussi l'erreur ORA 01722 nombre invalide,
    cela rejoindrait-il une erreur de conversion implicite ?
    quels tests ???

    avez-vous essayé de placer votre requête dans une variable VARCHAR2 et pas directement dans l'ordre EXECUTE IMMEDIATE ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  10. #10
    DBS
    DBS est déconnecté
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 29
    Points : 8
    Points
    8
    Par défaut
    Ma table B est la copie conforme de la table A, puisque je la cree ainsi :

    create table B as select * from A where 1=2;


    Les tests que j'ai effectue sont simplement :
    select ma_chaine_de_colonnes from A minus select ma_chaine_de_colonnes from B;

    J'ai constate que lorsque j'elimine certaine colonne de ma chaine (de type varchar2(250)) je n'obtiens plus l'erreur !

  11. #11
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Vous nous indiquez que que la longueur de votre chaine fait 1271 caractères et votre variable ne peut contenir qu'au maximum 250 caractères, il y a un problème là !
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  12. #12
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Citation Envoyé par plaineR
    Vous nous indiquez que que la longueur de votre chaine fait 1271 caractères et votre variable ne peut contenir qu'au maximum 250 caractères, il y a un problème là !
    Non, il veut juste dire que s'il retire certaines colonne de son select, cela passe.
    raison pour laquelle il s'agit peut-être d'une limitation de constante passée a EXECUTE IMEDIATE, et donc pourquoi je lui propose de stocker sa chaîne dans une variable et passer cette variable a EXECUTE IMMEDIATE.

    Mais il semble que ma proposition ne soit pas digne d'interêt...
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  13. #13
    DBS
    DBS est déconnecté
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 29
    Points : 8
    Points
    8
    Par défaut
    ma chaine qui est la concatenation de toutes les colonnes de ma table, est de type varchar2(5000).

    dans cette chaine pour faire des tests j'ai eliminait une colonne de type varchar2(250).

    pour que la comparaison soit optimiser je transtype les colonnes qui peuvent etre null :
    nvl(to_char(ma_col), '$$a$$b')

    Voila vous savez tout !

  14. #14
    DBS
    DBS est déconnecté
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 29
    Points : 8
    Points
    8
    Par défaut
    pardon "responsable oracle", je m'empresse de tester votre proposition...

  15. #15
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par SheikYerbouti
    Citation Envoyé par plaineR
    Vous nous indiquez que que la longueur de votre chaine fait 1271 caractères et votre variable ne peut contenir qu'au maximum 250 caractères, il y a un problème là !
    Non, il veut juste dire que s'il retire certaines colonne de son select, cela passe.
    raison pour laquelle il s'agit peut-être d'une limitation de constante passée a EXECUTE IMEDIATE, et donc pourquoi je lui propose de stocker sa chaîne dans une variable et passer cette variable a EXECUTE IMMEDIATE.

    Mais il semble que ma proposition ne soit pas digne d'interêt...
    J'avais pas tout compris ...
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  16. #16
    DBS
    DBS est déconnecté
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 29
    Points : 8
    Points
    8
    Par défaut
    Donc je viens de tester en passant ma requete dans une variable, et cela me renvoie la meme erreur : "nombre invalide".

    Ce qui est logique je pense car dans ma premiere version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate ' delete from A where (' || ma_chaine_de_colonnes || ') in (select ' || ma_chaine_de_colonnes || ' from B)';
    ma_chaine_de_colonnes est deja une variable de type varchar2(5000)

    donc passer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chn := ' delete from A where (' || ma_chaine_de_colonnes || ') in (select ' || ma_chaine_de_colonnes || ' from B)';
    et faire un :
    revient au meme non ?

  17. #17
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    pas forcément, car une variable VARCHAR2 peut contenir jusqu'à 32767 caractères alors qu'un littéral (chaine fournie entre quotes) est bloqué à 2000 ou 4000 caractères.

    Il ne vous reste plus qu'a stocker votre chaîne de caractères dans une table pour la visualiser et l'exécuter sous Sql*Plus pour comprendre.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  18. #18
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 135
    Points
    3 135
    Par défaut
    la cause est : NULL

  19. #19
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Citation Envoyé par bouyao
    la cause est : NULL
    : mais encore :
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  20. #20
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 135
    Points
    3 135
    Par défaut
    je voulais dire que ça vient d'une condition qui rends une valeur NULL

    EDIT: est-il possible d'avoir la version d'Oracle ?

    d'aprés
    nvl(to_char(ma_col), '$$a$$b')
    si le resultat est un blanc est vous êtes en 8.0 ça peut expliquer le problème.

    sinon si vous faites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select 1 from dual where 1 in (' ')
    ça donne l'erreur ORA-01722

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. Erreur ORA 06502 sur fonction
    Par khomar dans le forum Oracle
    Réponses: 2
    Dernier message: 14/12/2010, 17h15
  2. Réponses: 9
    Dernier message: 10/06/2009, 19h10
  3. Réponses: 4
    Dernier message: 09/12/2005, 18h40
  4. événement sur INSERT, DELETE, UPDATE
    Par papouAlain dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/12/2004, 16h40
  5. Erreur ORA-01036 sur un XMLGRAM
    Par sch dans le forum XMLRAD
    Réponses: 5
    Dernier message: 07/09/2004, 15h56

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