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 :

Optimisation Requete Insertion PL SQL


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Par défaut Optimisation Requete Insertion PL SQL
    Bonjour ,

    Merci de me guider afin d'optimiser ce PL/SQL :
    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
    create or replace TRIGGER FACTUREF_ANNEE_NUMERO
    BEFORE INSERT ON FACTUREF for each row
     
    DECLARE
        NEW_CLE_FAC VARCHAR2(8);
        NB NUMERIC;
        CPT NUMERIC;
     
    BEGIN
     
    SELECT count(CLE_FAC) INTO CPT FROM FACTUREF WHERE ANNEE_FAC = :new.ANNEE_FAC ;
     
    if CPT > 0 then
     
         SELECT MAX(CLE_FAC) INTO NEW_CLE_FAC FROM FACTUREF WHERE ANNEE_FAC = :new.ANNEE_FAC ;
     
         NEW_CLE_FAC := SUBSTR(NEW_CLE_FAC, 3, 8);
         NB := cast(NEW_CLE_FAC as numeric ) ;
         NB := NB + 1;
          NEW_CLE_FAC := cast(nb as varchar2);
         :new.CLE_FAC := concat(:new.ANNEE_FAC , LPAD(NEW_CLE_FAC, 6, '0')); 
     ELSE
        :new.CLE_FAC := concat(:new.ANNEE_FAC , '000001' ) ; 
    END IF;

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 959
    Par défaut
    Bonjour,

    Quel est le type d'optimisation qui est recherché ?
    Pour moi ce code est fonctionnellement faux, et ce, en dehors du fait qu'il n'est pas complet.

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Merci d'éditer ton message pour encadrer ton code des balises CODE (le # dans le menu d'édition)

    Normalement on pourrait simplifier comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TRIGGER FACTUREF_ANNEE_NUMERO
    BEFORE INSERT ON FACTUREF FOR EACH ROW
    DECLARE
      v_max VARCHAR2(8);
    BEGIN
    	SELECT :NEW.ANNEE_FAC || LPAD(NVL(TO_NUMBER(MAX(SUBSTR(CLE_FAC,3))), 0) + 1, 6, '0') INTO :NEW.CLE_FAC 
      FROM FACTUREF 
      WHERE ANNEE_FAC = :NEW.ANNEE_FAC ;
    END IF;
    Sauf que dans un trigger on ne peut pas faire de SELECT sur la table du trigger.
    Le code doit être déporté dans le programme faisant l'insert

  4. #4
    Membre habitué
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Par défaut
    Merci infiniment.
    Je suis un débutant avec oracle.

    Bon dév.

  5. #5
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Attention, si le but est d'incrémenter un numéro de facture ce code est complètement faux. Il va amener des doublons (lorsqu'il y aura un autre insert en même temps) et des trous (lorsqu'il y aura une transaction rollbackée).

Discussions similaires

  1. [MySQL] Optimisation requete InSERT into
    Par QAYS dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 08/07/2013, 10h28
  2. optimisation requete insert ou update sous postgres
    Par peppena dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 01/03/2007, 11h21
  3. effectuer une requete insert avec 'values' ET 'select'
    Par delaio dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/08/2004, 19h05
  4. [SYBASE] optimisation requete UPDATE
    Par metheorn dans le forum Sybase
    Réponses: 8
    Dernier message: 24/05/2004, 17h01
  5. Optimisation requetes SQL
    Par joel90 dans le forum Administration
    Réponses: 18
    Dernier message: 15/05/2004, 21h45

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