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 :

Problème d'exécution d'une procédure


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 48
    Par défaut Problème d'exécution d'une procédure
    bonjour
    je viens de creer une procedure qui calcule le nombre d'operation mais il me retourne une erreur voici le code de la procedure:
    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
    CREATE OR REPLACE PROCEDURE CNT IS
     
    cursor cur is select NUM_COMPTE,MONTANT,DATE_OPERATION,SENS from tst where NUM_COMPTE='0643536211004100'and DATE_OPERATION ='05/05/2008';
     
     
     NBOCR number(15,3);
     NBODB number(15,3);
    sens1 VARCHAR2(2 BYTE);
    sens2 VARCHAR2(2 BYTE);
    begin
     
    sens1 :='CR';
    sens2 :='DB';
    OPEN CUR; 
     
    for sens1 in cur
    loop
    select count(*) into tst1(NBOCR) from tst;
    end loop;
    for sens2 in cur 
    loop
    select count(*) into tst1(NBODB) from tst;
    end loop;
    CLOSE CUR;
    end cnt;
    voici l'erreur qui me donne:

    PLS-00357: Table,View Or Sequence reference 'TST1' not allowed in this context
    merci de me dire pourquoi il m'affiche cette erreur.

  2. #2
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 48
    Par défaut
    LE champ NBOCR ET NBOdb se trouvent dans la table TST1.

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    INTO tst1(NBODB) ça ne veut rien dire

    Tu veux faire quoi ?

  4. #4
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 48
    Par défaut
    je veux compter le nombe des operation créditeur CR et le nombre des opérations débiteur DB sachant que les sont enregistré dans la table tst:
    exemple des données de la table TST:

    NUM_COMPTE DATE_OPERATION MONTANT SENS

    0643536211004100 05/05/2008 3000 DB
    0643536211004100 02/05/2008 15000 DB
    0643536211004100 23/05/2008 6000 DB
    0643536211004100 08/05/2008 48984 DB
    0668236211000100 08/05/2008 1000 DB
    0668236211000100 08/05/2008 6 DB
    0668236211000100 02/05/2008 4500 CR
    0668236211000100 21/05/2008 6 DB
    0668236211000100 21/05/2008 2000 DB
    0668236211000100 11/05/2008 1000 DB
    0668236211000100 11/05/2008 6 DB
    0668236211000100 11/05/2008 1000 DB
    0668236211000100 11/05/2008 6 DB
    0668236211000100 25/05/2008 6 DB
    et je veux avoir dans la table tst1 le nombre des opérarion suivant le sens de l'operation
    voici la table tst1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE TST1
    (
      NUM_COMPTE  VARCHAR2(16 BYTE)                 NOT NULL,
      NBOCR       NUMBER(15,3),//nombre opération créditeur.
      NBODB       NUMBER(15,3),//nombre operation debiteur.
      MONTANT     NUMBER(15,3),
      SENS        VARCHAR2(2 BYTE),
      MOIS        DATE
    )

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO table(colonne) SELECT colonnes FROM table2
    Pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT colonnes INTO table(colonne)

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT valeur INTO variable
    permet d'insérer le résultat de la requête dans une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO table SELECT valeur
    permet d'insérer le résultat de la requête dans une table

    Tu as mélangé les 2.

    Pourquoi pas tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO TST1
    SELECT NUM_COMPTE,SUM(MONTANT),COUNT(NBOCR),COUNT(NBODB),SENS,MOIS FROM tst 
    GROUP BY COMPTE, SENS, MOIS;

  7. #7
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 48
    Par défaut
    jai essayé mais il ne retourne rien CREATE OR REPLACE PROCEDURE CNT IS

    cursor cur is select NUM_COMPTE,MONTANT,DATE_OPERATION,SENS from tst where NUM_COMPTE='0643536211004100'and DATE_OPERATION ='05/05/2008';


    NBOCR number(15,3);
    NBODB number(15,3);
    sens1 VARCHAR2(2 BYTE);
    sens2 VARCHAR2(2 BYTE);
    MOIS date;
    begin

    sens1 :='CR';
    sens2 :='DB';
    OPEN CUR;


    loop
    INSERT INTO TST1

    SELECT NUM_COMPTE,SUM(MONTANT),COUNT(NBOCR),COUNT(NBODB),SENS,MOIS FROM tst
    GROUP BY NUM_COMPTE, SENS, MOIS;

    end loop;
    CLOSE CUR;

    end cnt;

    il ne retourne rien

  8. #8
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 48
    Par défaut
    parce que dans le champs montant, je dois calculer cet montant en additionnant tous les montant effectueé durant un moi par exemple ici le mois est mai (05/2008) par exemple
    NUM_COMPTE DATE_OPERATION MONTANT SENS

    0668236211000100 08/05/2008 1000 DB
    0668236211000100 08/05/2008 6 DB
    0668236211000100 02/05/2008 4500 CR
    0668236211000100 21/05/2008 6 DB


    pour calculer le montant on fait la formule suivant
    montant=(-1000)+(-6)+4500+(-6)
    en fait le signe moins (-) parceque le compte est débiteur le compte créditeur reste comme il est sans ajouter le signe moins.
    et le resultat sortie en le stocke de la champ montant de la table tst1
    et pour le champs sens de la table tst1 en le rempli soit DB soit CR selon le signe de montant obtenu dans ce mois si le montant est inferieur à 0 alors on ecrit dans SENS DB sinon on ecrit CR.



    comment inclut cette requete dans ma procedure
    INSERT INTO TST1
    SELECT NUM_COMPTE,SUM(MONTANT),COUNT(NBOCR),COUNT(NBODB),SENS,MOIS FROM tst
    GROUP BY COMPTE, SENS, MOIS;

  9. #9
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 48
    Par défaut
    je suis vraiment coincé a ce niveau je ne sais pas comment résoudre ce probleme.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 69
    Par défaut
    Bonjour ,
    Puisque que personne ne répond je me permet de répondre je suis que débutant en PL/SQL mais pour ton problème si j'ai bien compris j'aurais fais quelque chose dans ce style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Insert into tst1 
     
    SELECT 
    num_compte,
    COUNT( CASE WHEN sens= 'CR' THEN 1 END) AS NBOCR,
    COUNT( CASE WHEN sens = 'DB' THEN 1 END) AS NBODB,
    SUM( CASE WHEN sens= 'CR' THEN  MONTANT ELSE - MONTANT END) as montant,
    (case when SUM( CASE WHEN sens= 'CR' THEN  MONTANT ELSE - MONTANT END) > 0 then 'CR' else 'DB' end ) AS SENS,
    to_char(date_operation, 'MM')as mois
    from tst
    group by num_compte,to_char(date_operation,'MM')
    order by num_compte asc;
    j'espere que ça t'aidera
    ++

  11. #11
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 48
    Par défaut
    bonjour merci pour ton aide.

    et jai dèjà resolu le probleme en creant cette procedure voir le code.

    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
    CREATE OR REPLACE PROCEDURE gg IS
    NDB NUMBER(15,3);
    MDB NUMBER(15,3);
    MCR NUMBER(15,3);
    NCR NUMBER(15,3);
    mt  NUMBER(15,3);
    sns VARCHAR2(2 BYTE);
    BEGIN
     
     
       select sum(montant),count(*) into MDB,NDB from tst where num_compte='0668236211000100' and sens='DB' and to_char(date_operation,'mm')='01';
       select sum(montant),count(*) into MCR,NCR from tst where num_compte='0668236211000100' and sens='CR' and to_char(date_operation,'mm')='01';
     
       if MCR is null
       then MCR :=0;
       end if;
       if MDB is null
       then MDB :=0;
       end if;
     
       mt :=MCR-MDB;
     
       IF mt < 0
       then sns :='DB' ;
       mt:=(-1)*mt;
       else sns :='CR';
       end if;
       insert into tst1 (num_compte,montant,sens,mois,nbodb,nbocr) values ('0668236211000100',(mt),(sns),to_char(sysdate,'mm')-1,ndb,ncr);
     
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
           NULL;
         WHEN OTHERS THEN
           -- Consider logging the error and then re-raise
           RAISE;
    END gg;
    /
    merci

  12. #12
    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
    Merci d'utiliser la balise code (l'icône #) pour votre code.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/10/2011, 10h15
  2. Réponses: 2
    Dernier message: 29/05/2007, 14h50
  3. [VB6] Durée d'exécution d'une procédure
    Par Invité dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/10/2005, 14h51
  4. Problème Alter view dans une procédure stockée
    Par adjava dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/07/2005, 17h45
  5. Réponses: 15
    Dernier message: 08/07/2004, 08h20

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