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 procédure oracle


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut problème procédure oracle
    Bonjour à tous,

    voilà je viens de commencer sur le PL/SQL et j'ai un souci avec la proc ci-dessous.
    Pour simplifier j'ai une table GARANTIE qui a 3 champs : No_ADH numéro d'adhérent, DT_NAISS date de naissance et NORNGA (rang de naissance mais peu importe l'ordre)
    Je voudrais que pour chaque numéro d'adhérent, la procédure update le champ NORNGA vide de ma table GARANTIE et lui mette 2, puis 3 et 4... pour chaque ligne avec date de naissance. Puis pour un nouveau numéro d'adhérent, le NORNGA se remet à 2, puis 3 etc....
    On a donc un num adhérent, une date de naissance et un num de rang null

    NO_ADH - DT_NAISS - NORNGA
    1000 - 30/05/1950 - 1
    1000 - 14/6/1974 - null
    1000 - 7/6/ 1942 - null
    1000 - 1/10/1980 -null
    2000 -4/4/1973 -1
    2000 -7/6/1974 - null
    2000 -7/9/1977 - null
    devienne après la proc
    NO_ADH - DT_NAISS - NORNGA
    1000 - 30/05/1950 - 1
    1000 - 14/6/1974 - 2
    1000 - 7/6/ 1942 - 3
    1000 - 1/10/1980 -4
    2000 -4/4/1973 -1
    2000 -7/6/1974 - 2
    2000 -7/9/1977 - 3
    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 procedure UPDATE_NORNGA is
    P_NUM_ADH Varchar2(15);
    i integer (2);
    c integer (2);
    DECLARE
    cursor C_NO_ADH is
    select NO_ADh from garantie
     
    BEGIN
     
    c:= select count(dt_naiss) from tfp_ech_garantie where no_adh=P_NUM_ADH 
    i:= 2
    j:= i+1
     
    for i to c
     
    LOOP
     
    UPDATE GARANTIE
    set NORNGA = j
    where no_adh=P_NUM_ADH
    and DT_NAISS is null;
     
    END UPDATE_NORNGA;
    Merci à vous

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Salut,

    A priori pas besoin de PL/SQL sutout si c'est du one shot, sinon tu peux créer une procédure autour de la requête.

    Par contre je ne comprends pas bien :
    NORNGA (rang de naissance mais peu importe l'ordre)
    Justement l'ordre est très important, en tout cas ma proposition trie en fonction de la dt_naiss.
    Mais, comme tu sembles avoir déjà des lignes où NORNGA est à 1 pour chaque NO_ADH, je te propose une requête qui n'updatera que les NULLs en laissant à 1 ceux qui sont déjà renseignés même s'ils ont une dt_naiss inférieure.

    Tu peux utiliser MERGE - je pars du principe que le couple (no_adh,dt_naiss) est unique mais si tu as une PK utilise la dans le SELECT du USING et dans le ON - donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    merge into t1
    using (
      select no_adh,dt_naiss, 
    	 row_number() over (partition by no_adh order by dt_naiss)+1 nornga 
      from t1 
      where nornga is null
    ) t2
    on (t1.no_adh=t2.no_adh and t1.dt_naiss=t2.dt_naiss)
    when matched then
    update set t1.nornga = t2.nornga
    qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SQL> select * from t1 order by no_adh,nornga;
     
        NO_ADH DT_NAISS      NORNGA
    ---------- --------- ----------
          1000 30-MAY-50          1
          1000 07-JUN-42          2
          1000 14-JUN-74          3
          1000 01-OCT-80          4
          2000 04-APR-73          1
          2000 07-JUN-74          2
          2000 07-SEP-77          3
     
    7 rows selected.
    Mais je crois que la possibilité de ne pas préciser WHEN NOT MATCHED dans le MERGE dépend de la version (peut être à partir de 10G).
    Je suis presque sûr qu'il est possible d'écrire juste un UPDATE mais je ne me souviens plus de la syntaxe...
    Si une âme charitable peut me rafraichir la mémoire, ce sera avec plaisir.
    Je laisse le CTAS pour plus de facilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create table t1 as (
    select 1000 as NO_ADH , to_date('30/05/1950','dd/mm/yyyy') as DT_NAISS , 1 as NORNGA from dual union all
    select 1000 , to_date('14/06/1974','dd/mm/yyyy'), null from dual union all
    select 1000 , to_date('07/06/ 1942','dd/mm/yyyy'), null from dual union all
    select 1000 , to_date('01/10/1980','dd/mm/yyyy') ,null from dual union all
    select 2000 , to_date('04/04/1973','dd/mm/yyyy') ,1 from dual union all
    select 2000 , to_date('07/06/1974','dd/mm/yyyy') , null from dual union all
    select 2000 , to_date('07/09/1977','dd/mm/yyyy') , null from dual
    )
    En attendant peut être que ta version est suffisante pour que le MERGE fonctionne.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut
    Salut skuatamad

    je te remercie pour ta réponse je vais tester ça demain et je te tiens au courant. Thanks

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut
    Hélas ça ne parche pas.
    J'ai un message "missing keyword" à la fin du code, même en ayant rajouté un ";" à la fin ?

    Ce serait parce que je suis en oracle v9 ?
    Merci d'avance

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Oui je pense que le MISSING Key Words viens de l'absence du NOT MATCHED en 9i.

    Bon j'ai trouvé une syntaxe qui devrait passer sur une 9i, mais que je l'ai testé sur une 11G alors ça n'est peut être toujours pas bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    update t1 set nornga = (
    	with t as (
    		SELECT no_adh, dt_naiss,row_number() over (partition BY no_adh ORDER BY dt_naiss)+1 as new_n 
    		FROM t1 
    		WHERE nornga IS NULL)
    	select new_n from t where t.no_adh = t1.no_adh and t.dt_naiss = t1.dt_naiss
    	)
    where nornga is null
    Par contre, le couple (no_adh, dt_naiss) DOIT être unique pour que la requête fonctionne...
    Si tu as une PK autre utilise la.

Discussions similaires

  1. Problème procédure Oracle
    Par thomasaurelien dans le forum PL/SQL
    Réponses: 3
    Dernier message: 26/01/2012, 15h06
  2. Problème Procédure Oracle-PL/SQL
    Par Macxx7 dans le forum Oracle
    Réponses: 1
    Dernier message: 20/01/2011, 11h41
  3. Problème sur Oracle Toolbox
    Par Doctor Z dans le forum Oracle
    Réponses: 9
    Dernier message: 09/11/2004, 08h48
  4. Problème Migration Oracle
    Par bob_doulz dans le forum Administration
    Réponses: 4
    Dernier message: 20/04/2004, 09h56
  5. Problème composant Oracle
    Par alexmorel dans le forum Bases de données
    Réponses: 12
    Dernier message: 24/02/2004, 08h53

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