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 :

Encore une procédure


Sujet :

PL/SQL Oracle

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 30
    Par défaut Encore une procédure
    Code sql : 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
     
    CREATE OR REPLACE PROCEDURE proc_logem_dimin_pourc  
    (p_pourc IN NUMBER,
     p_nomquart IN Quartier.nomquart%TYPE,
     p_nomcom IN Commune.nomcom%TYPE)
     
    IS
     
    CURSOR Cur_Logements_pourc IS
     
    SELECT
    L.idlog, L.numero, L.loyer, Q.nomquart, C.nomcommune
    FROM
    Commune C, Quartier Q, Logement L
    WHERE
    C.idcom = Q.idcom
    AND
    Q.idquart = L.idquart
    AND
    p_nomquart = Q.nomquart
    AND
    p_nomcom = C.nomcom
    FOR UPDATE OF L.loyer;
     
    BEGIN
     
    FOR enreg IN Cur_Logements_pourc
    LOOP
    UPDATE Logement SET
    L.loyer = (1 - p_pourc/100) * L.loyer
    WHERE CURRENT OF Cur_Logements_pourc;
    END LOOP;
     
    END proc_logem_dimin_pourc ;
     
    /

    pourquoi me met il cette erreur ????????

    ERREUR à la ligne 23 : PL/SQL: SQL Statement ignored 0,00 secondes

  2. #2
    Membre émérite Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Par défaut
    bonjour,

    pourquoi dans ton curseur tu fais FOR UPDATE?

    Peux-tu l'enlever pour voir.

    N'oublie pas de faire un commit dans ta procédure.

  3. #3
    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 zell61 Voir le message
    ...pourquoi me met il cette erreur ????????

    ERREUR à la ligne 23 : PL/SQL: SQL Statement ignored 0,00 secondes
    Vous voulez de l'aide ? Fournissez un jeu d'essai complét: création des tables, insertion des données, code des procédures, messages d'erreur, etc.

  4. #4
    Membre chevronné
    Avatar de Bibeleuh
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2010
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 209
    Par défaut
    Quand je copie colle ton code j'ai un avertissement :

    A cursor for loop that contains DML statements should be refactored to use BULK COLLECT and FORALL


    Je te conseil donc au lieu de faire un curseur de faire un bulck collect de ton select directement dans un tableau contenant tes 4 champs.

    Ensuite tu pourra faire un
    FORALL enreg IN tontableau
    Update.....

    Désolé pour cette syntaxe très approximative

  5. #5
    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 Bibeleuh Voir le message
    Un truc dans le genre ?
    ...
    La syntaxe proposée est très approximative et ajouter un commit dans la procédure n’est pas une bonne idée non plus.

  6. #6
    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
    C'est ton update qui a un alias de table inconnu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     UPDATE Logement 
      SET loyer = (1 - p_pourc/100) * loyer
      WHERE CURRENT OF Cur_Logements_pourc;
    mais bien sur faire une boucle pour un update, n'est pas optimisé.
    Un simple update suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE Logement L
    SET loyer = (1 - p_pourc/100) * loyer
    WHERE EXISTS ( 
        SELECT 1
        FROM Commune C, Quartier Q
        WHERE C.idcom = Q.idcom
        AND Q.idquart = L.idquart
        AND Q.nomquart = p_nomquart
        AND C.nomcom = p_nomcom
        )

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Transformation de date dans une procédure stockée
    Par bd0606 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/10/2003, 11h31
  3. Réponses: 12
    Dernier message: 27/08/2003, 11h04
  4. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 15h33
  5. Fin de programme dans une procédure
    Par Sinclair dans le forum Langage
    Réponses: 13
    Dernier message: 29/11/2002, 22h30

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