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 :

Probleme condition sur select PL/SQL


Sujet :

Oracle

  1. #1
    Membre averti
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Points : 423
    Points
    423
    Par défaut Probleme condition sur select PL/SQL
    Bonjour,

    Voila mon problème j'aimerai savoir si une variable est déjà enregistrée en table afin de savoir si celui si est un doublon ou pas.

    Au debut j'ai essayé avec un curseur sur la table a interroger en passant donc par des variables mais le traitement était super long.

    Là j'essaie de passer par une interrogation de base mais je rencontre un problème, quand ma requête ne contient pas résultat (donc pas un doublon) cela m'arrête le programme.

    Voici mon code n'y a-t-il pas une manière plus intelligente de le coder ?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Si vous voulez éviter les doublons, pourquoi ne pas simplement mettre une contrainte d'unicité sur votre colonne ?

  3. #3
    Membre averti
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Points : 423
    Points
    423
    Par défaut
    Je ne veux pas les éviter mais juste savoir si mon identifiant a déja été rencontré pour effectuer des cumuls par la suite.

    Pour mieux expliquer :
    • Je lis un fichier ligne par ligne
    • J'extrait de cette ligne des données en variable
    • Si l'identifiant est déja enregistré en table alors traitement1
    • SI l'identifiant n'est pas enregistré en table alors traitement2

  4. #4
    Membre averti
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Points : 423
    Points
    423
    Par défaut
    Et quand je dis traitement c'est pas mal de lignes de code (200 si pas doublons et 100 si doublon 4 cumuls avec pour chaque cumul des conditions).

    En fait avec un curseur ca marchait nickel, mais le problème est le temps d'exécution que je dois diminuer de 30-40 %.
    Et je pense que c'est vraiment à ce niveau que je peux optimiser.

    Mon code à optimiser :

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Des doublons avec un like ? C'est bizarre !

    mais bon, la bonne manière de tester des doublons en select c'est de gérer les exception.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DECLARE 
    	v NUMBER;
    BEGIN 
      SELECT 1
      INTO v
      FROM TA_INT_SAS
      WHERE NUMOPER LIKE '%'||my_CRO.NOREFINT||'%' 
      AND ROWNUM= 1;
      eDoublon := TRUE;
    EXCEPTION WHEN NO_DATA_FOUND 
    THEN eDoublon := FALSE;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Membre averti
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Points : 423
    Points
    423
    Par défaut
    YES !! Je n'avais pas pensé à coder une exception !

    Merci beaucoup !

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Cela dit, si tu veux aussi qu'on t'aide à optimiser ton traitement, y'a pas de problèmes, t'as qu'à poster le code complet.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    L'exception n'est pas à mettre à la fin de ta procédure !
    Voilà ce que tu as fait :
    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
    BEGIN
       LOOP
            IF eUnitaire=TRUE
            THEN
              SELECT NUMOPER
              INTO my_doublonSAS.NUMOPER
              FROM TA_INT_SAS
              WHERE NUMOPER LIKE '%'||my_CRO.NOREFINT||'%';
           END IF;
     
           IF eDoublon = TRUE.
           THEN
           	..
            END IF;
            END LOOP;
        EXCEPTION 
        WHEN NO_DATA_FOUND 
            THEN eDoublon := FALSE;
    END;
    Donc s'il n'y a pas de doublon, tu sors de ta boucle et de la procédure.
    Il faut faire ceci :
    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
    BEGIN
       LOOP
            IF eUnitaire=TRUE
            THEN
              BEGIN
           SELECT NUMOPER
              INTO my_doublonSAS.NUMOPER
              FROM TA_INT_SAS
              WHERE NUMOPER LIKE '%'||my_CRO.NOREFINT||'%' AND rownum = 1;
      EXCEPTION 
        WHEN NO_DATA_FOUND 
            THEN eDoublon := FALSE;
           END IF;
     
           IF eDoublon = TRUE.
           THEN
           	..
            END IF;
            END LOOP;
     
    END;
    Attention le rownum est important, parce que si tu as plusieurs lignes, l'exception levée sera too_many_rows.

    Sinon, je ne comprends pas vraiment le code. Pourquoi passer par un LIKE et récupérer le NUMOPER dans my_doublonSAS.NUMOPER ?
    Si tu as 3 lignes avec comme numoper A, AA, AAB et que ton NOREFINT vaut A, qu'est ce que tu dois faire ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Membre averti
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Points : 423
    Points
    423
    Par défaut
    En fait j'initialise eDoublon à TRUE pas à FALSE, donc si ma requête trouve un resultat l'exception ne se déclenche pas et eDoublon sera à TRUE et effectuera les traitements de TRUE.

    J'ai testé ta solution et j'ai gagné 1/3 de temps vraiment merci.

  10. #10
    Membre averti
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Points : 423
    Points
    423
    Par défaut
    Ha oui aussi pour lire mon fichier et en extraire les données qui m'interresse je passe par une fonction SQL*LOAD qui charge ces données en base....je pensse que si j'arriverai a lire mon fichier avec PL*SQL et attribuer les positions a des variables ca me ferai gagner énormement de temps
    Par exemple :

    ouverture fichier
    pour chaque ligne
    ma variable <--- chaine pos 100 à 115
    fin
    fermeture

    merci d'avance

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Quelle est votre version d'Oracle ?

  12. #12
    Membre averti
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Points : 423
    Points
    423
    Par défaut
    SQL*Plus: Release 10.2.0.4.0

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    SQL*Plus c'est le client avec lequel vous vous connectez à Oracle mais ce n'est pas votre base.

    Vous aurez la réponse en exécutant la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from sys.v_$version
    Celà dit on peut supposer que vous êtes en version 10g.
    Vous pouvez créer une table en mode EXTERNAL :


    Toute la partie SQL*Loader devient alors transparente.

  14. #14
    Membre averti
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Points : 423
    Points
    423
    Par défaut
    oui je sais mais ca va de pair

    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0

  15. #15
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Non pas forcément. Avec votre client 10g vous pouvez très bien vous connecter à une base 8i ou 9i ou encore 11g.

  16. #16
    Membre averti
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Points : 423
    Points
    423
    Par défaut
    Je pensse pas que cela ai une utilité dans mon cas , car cela me permet juste de remplacer mon SQL*LOAD alors que je veux au contraire sauter cette étape :
    Je vais mieu expliquer mon cas :

    Ce que je fai actuellement :

    un fichier en entrée
    Je charge ce fichier dans une premiere table (qui me sert a rien concretement a part a récolter les données du fichier le but étant alimenter au autre table)
    a partir de la table chargé :
    je passe les données de ma table en variable afin d'effectuer différent traitement ... une fois ces traitements terminés j'aliment une 2em table.

    Ce qui je voudrai faire :

    lire mon fichier
    Pour chaque ligne de mon fichier
    en extraire les champs que me seront utils dans des variables
    Effectuer mes traitements
    Alimenter ma table

    voila j'espere avoir été assez clair ,
    ce que je voudrai savoir c'est comment passer des champs de positions de chaque lignes de mon fichier dans des variables PL*SQL

    merci d'avance

  17. #17
    Membre averti
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Points : 423
    Points
    423
    Par défaut
    viens de trouver une solution pour recuperer ma ligne :

    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
    Declare
      -- Noms des fichiers --
      LC$Fic_in   Varchar2(128) := 'EMP.TXT' ;       -- a adapter sur votre configuration
      LC$Fic_out  Varchar2(128) := 'EMP2.TXT' ;      -- a adapter sur votre configuration
      -- Noms des répertoires --
      LC$Dir_in   Varchar(30)   := 'FICHIERS_IN';    -- a adapter sur votre configuration
      LC$Dir_out  Varchar(30)   := 'FICHIERS_OUT' ;  -- a adapter sur votre configuration
      -- Pointeurs de fichier --
      LF$FicIN	UTL_FILE.FILE_TYPE ;
      LF$FicOUT	UTL_FILE.FILE_TYPE ;
      -- Tampon de travail --  
      LC$Ligne	Varchar2(32767) ;  
      -- Message --
      LC$Msg    Varchar2(256) ;
      -- Exception --
      LE$Fin    Exception ;
    Begin
     
      -- Ouverture du fichier en entrée
      Begin
        LF$FicIN := UTL_FILE.FOPEN( LC$Dir_in, LC$Fic_in, 'R', 32764 ) ;
      Exception
        When OTHERS Then
    	LC$Msg := SQLERRM || ' [' || LC$Dir_in || '] -> ' || LC$Fic_in;
    	Raise LE$Fin ;
      End ;
     
      -- Ouverture du fichier en sortie
      Begin
        LF$FicOUT := UTL_FILE.FOPEN( LC$Dir_out, LC$Fic_out, 'W', 32764 ) ;
      Exception
        When OTHERS Then
    	LC$Msg := SQLERRM || ' [' || LC$Dir_out || '] -> ' || LC$Fic_out;
    	Raise LE$Fin ;
      End ;	
     
      -- Traitement --
      Begin
         Loop
    	-- lecture du fichier en entrée --
    	UTL_FILE.GET_LINE( LF$FicIN,  LC$Ligne ) ;
    	-- écriture du fichier en sortie --
    	UTL_FILE.PUT_LINE( LF$FicOUT, LC$Ligne ) ;
         End loop ;
      Exception
         When NO_DATA_FOUND Then -- Fin du fichier en entrée
            -- Fermeture des fichiers --
    	UTL_FILE.FCLOSE( LF$FicIN ) ;
    	UTL_FILE.FCLOSE( LF$FicOUT ) ;
      End  ;		 		
     
    Exception
       When LE$Fin Then
         UTL_FILE.FCLOSE_ALL ;
         RAISE_APPLICATION_ERROR( -20100, LC$Msg ) ;
    End ;

    n'est il pas possible a partir de ma ligne recuperer des champs en tronquant ma chaine du style mavar := substring(maligne , 10 , 15); ???

  18. #18
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    C'est SUBSTR sous Oracle.

    Et tu as INSTR pour rechercher la position d'un caractère (ou du Xème caractère) dans une chaine.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  19. #19
    Membre averti
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Points : 423
    Points
    423
    Par défaut
    Okay thx j'implemente cela et vous fait un pti retour sur combien jai gagné en temps d'éxécution

  20. #20
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par l4r3nZu Voir le message
    ...
    Ce qui je voudrai faire :

    lire mon fichier
    Pour chaque ligne de mon fichier
    en extraire les champs que me seront utils dans des variables
    Effectuer mes traitements
    Alimenter ma table
    ...
    Bref, cela revient à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT/UPDATE/MERGE Into ma_table
    Select mes_colonnes
      from (table(ma_procédure_pipelined_qui_utilise_une_table_externe))
    /
    ou des autres variations de cette solution.
    Improving performance with pipelined table functions

Discussions similaires

  1. probleme soustraction sur une requte sql
    Par kroma23 dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/06/2011, 13h27
  2. [MySQL] condition sur une requete sql
    Par brahda dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/05/2011, 18h09
  3. condition sur resultat requete sql
    Par GYooo dans le forum Android
    Réponses: 1
    Dernier message: 02/03/2011, 15h02
  4. condition sur la requete sql : is nothing
    Par ciara dans le forum VB.NET
    Réponses: 2
    Dernier message: 22/09/2009, 15h08
  5. Réponses: 3
    Dernier message: 03/05/2007, 11h06

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