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

PL/SQL Oracle Discussion :

Gestion exception ORA-00001


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Par défaut Gestion exception ORA-00001
    Bonjour à tous.

    J'ai une question un peu bête mais à laquelle j'ai pas trouvé de réponse.
    Je voudrais insérer dans une tale le contenu d'une autre tout en gérant l'exception "ORA-00001: violation de contrainte unique"
    Par exemple j'ai deux tables test_1 et test_2:

    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
    create table test_1
    (
      TEST VARCHAR2(64) not null
    );
    alter table 
      test_1 add constraint test_1_pk primary key (TEST);
    insert into test_1 values('bbb');
    commit;
     
    create table test_1
    (
      TEST VARCHAR2(64) not null
    );
    alter table 
      test_1 add constraint test_1_pk primary key (TEST);
    insert into test_1 values('bbb');
    commit;
    insert into test_1 values ('aaa');
    insert into test_1 values ('bbb');
    insert into test_1 values ('ccc');
    commit;
    Et quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into test_1 select * from test_2
    je voudrais que l'exception sur la valeur 'aaa' soit tout simplement ignorée et
    l'instruction continue.

    NB : Je ne veux pas utiliser de curseur ni de boucle parce que les tables sont assez volumineuses.

    Quelqu'un pourrait-il m'aider?
    Merci d'avance.

  2. #2
    Expert confirmé
    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
    Par défaut
    Ajoutez une clause WHERE filtrant les lignes de la table 2 qui n'appartiennent pas à la table 1

  3. #3
    Membre éclairé Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Par défaut
    Merci pour votre réponse, mais selon votre expérience, comparée à la requête sans clause where cela n'affecterait pas trop la performance?

  4. #4
    Expert confirmé
    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
    Par défaut
    Je crains qu'il ne s'agisse pas de performance mais simplement de faisabilité.
    Si la condition porte sur une colonne indexée, cela ne devrait pas être un problème. Sinon, je ne vois pas comment intercepter l'erreur sans curseur ni collection

  5. #5
    Membre éclairé Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Par défaut
    OK Merci SheikYerbouti, je me lance.
    En passant je tiens à vous féliciter et à vous encourager pour vos excellents tutoriels sur le site sans lesquels je ne serais pas ici aujourd'hui
    Bonne continuation.

  6. #6
    Expert confirmé
    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
    Par défaut
    ... A moins que ...

    Voir cette entrée de la FAQ

  7. #7
    Membre éclairé Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Par défaut
    Je n'arrivais pas à exploiter UTLEXCPT.SQL alors j'ai adopté une autre solution :
    Créer une colonne qui servira d'identifiant alimenté par une séquence pour la table source, et checher la valeur la plus elevée de cette colonne sur la table destination, ensuite insérer les lignes dont l'identifiant est supérieur à cette valeur.

    Par contre je ne comprends pas pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE
      v_max PLS_INTEGER;
    BEGIN
      SELECT MAX(id_ligne) INTO v_max FROM test_1;
      INSERT INTO test_1
        SELECT * FROM test_2 WHERE id_ligne > v_max and id_pr0j LIKE 'PRJ1%';
      COMMIT;
    END;
    prend plusieurs minutes alors que si je fais manuellement:
    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
    SQL> select max(id_ligne) from test_1;
     
    MAX(ID_LIGNE)
    -------------
         34746998
     
    SQL> INSERT INTO test_1
      2    SELECT *
      3      FROM test_2
      4     WHERE id_ligne > 34746998
      5       AND id_pr0j LIKE 'PRJ1%';
     
    28 rows inserted
     
    SQL> commit;
    Ca ne prend même pas une seconde

  8. #8
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Salut SheikYerbouti ,
    A quelle Faq ton lien fait référence précisement ?

    @ilalaina
    Quelle version d'Oracle ? (Pour quoi personne n'indique la version )
    Oracle 10GR2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO test_1 SELECT * FROM test_2
    LOG ERRORS INTO errlog_table ('my_tag') REJECT LIMIT 10;

  9. #9
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Salut SheikYerbouti ,
    A quelle Faq ton lien fait référence précisement ?
    Salut Mnitu,
    et bien il suffit de cliquer le lien. Il concerne l'activation de contraintes (FAQ Oracle).

  10. #10
    Membre éclairé Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Par défaut
    Merci pour la réponse Mnitu.
    @ilalaina
    Quelle version d'Oracle ? (Pour quoi personne n'indique la version )
    Désolé j'aurais du mentionner la version que j'utilise : Oracle 8.1.7.0.0.
    Malheureusement je ne crois pas qu'il y ait d'Error logging en Oracle 8.
    A propos de ma dernière question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DECLARE
      v_max PLS_INTEGER;
    BEGIN
      SELECT MAX(id_ligne) INTO v_max FROM test_1;
      INSERT INTO test_1
        SELECT * FROM test_2 WHERE id_ligne > v_max AND id_pr0j LIKE 'PRJ1%';
      COMMIT;
    END;
    Une petite idée?

  11. #11
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    Salut Mnitu,
    et bien il suffit de cliquer le lien. Il concerne l'activation de contraintes (FAQ Oracle).

    SheikYerbouti clique sur ce lien et dit mois quelle est le FAQ que j'indique.

  12. #12
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Je viens de le dire cette semaine à quelqu’un d’autre. D’abord tu ne compare pas la même chose : dans le cas du block Pl/SQL les requête utilisent des variables de binding ; dans le cas de tes « mêmes » requêtes en SQL les valeurs sont des littéraux passé en dur. Pour l’optimiseur ce sont deux requêtes différentes qui, plus importante encore, lui apporte des informations différentes, donc optimisées d’une manière différente.
    Mais, peut être que tu l’exécute sur deux base différentes (c’est déjà vu) ou qui sait quoi d’autres choses intervient.
    Si tu veux vraiment comprendre de où vient ton souci :
    • vérifie les statistiques
    • exécute avec la trace sql et utilise tkprof pour analyser le résultat

  13. #13
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par mnitu Voir le message
    SheikYerbouti clique sur ce lien et dit mois quelle est le FAQ que j'indique.
    Ce lien pointe sur l'entrée : Comment différencier NULL et chaîne vide ?

    Celui que je donnais pointe sur une autre entrée: http://oracle.developpez.com/faq/?pa...#errconstraint

  14. #14
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    Ce lien pointe sur l'entrée : Comment différencier NULL et chaîne vide ?

    Celui que je donnais pointe sur une autre entrée: http://oracle.developpez.com/faq/?pa...#errconstraint
    Ca c'est vrai! Le problème est que mon navigateur ne se positionne pas sur la bonne entrée.
    Désolé, je n’ai jamais voulu suggéré que vous avez indiqué un mauvais lien.

    [Edit]
    Bref, pour la fin de l'histoire Firefox se positionne bien, Windows Internet Explorer à du mal.
    [/Edit]

Discussions similaires

  1. Gestion de l'exception ORA-02291
    Par Stouille89 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 08/08/2008, 15h40
  2. Réponses: 2
    Dernier message: 15/11/2005, 09h58
  3. Gestion exceptions sql server 2000
    Par gdido dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/10/2005, 10h27
  4. Réponses: 4
    Dernier message: 15/06/2004, 17h36
  5. Exemples XMLGram Chart et Gestion Exception
    Par Sylvain James dans le forum XMLRAD
    Réponses: 5
    Dernier message: 05/05/2003, 18h50

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