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 :

plsql refacotiser les curseurs?


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Par défaut plsql refacotiser les curseurs?
    bonjour,

    toujours dans la joie de millers de lignes plsql, je trouve dans les curseurs, d'horrible copier coller comme 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
     
     CURSOR c_sap004 (p_soort_tabel IN sap004.t04_soort_tabel%type) IS
          SELECT t04.ROWID
          ,      t04.t04_eind_stempel   eindstempel
          FROM   sap004 t04
          WHERE  t04.t04_eind_stempel > SYSDATE
          AND    t04.t04_soort_tabel  = p_soort_tabel
       UNION
          SELECT a.ROWID
          ,      a.t04_eind_stempel
          FROM   sap004 a       
          WHERE  t04_soort_tabel = p_soort_tabel
          AND    a.t04_eind_stempel = (SELECT b.t04_begin_stempel
                                       FROM   sap004 b
                                       WHERE b.t04_eind_stempel > SYSDATE
                                       AND   b.t04_soort_tabel  = a.t04_soort_tabel
                                       AND   b.t04_sector       = a.t04_sector
                                       AND   b.t04_code         = a.t04_code
                                       AND   b.t04_ingdat       = a.t04_ingdat);
    et

    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
     
      CURSOR c_sap007 (p_soort_tabel IN sap007.t06_soort_tabel%type) IS
          SELECT t06.ROWID
          ,      t06.t06_eind_stempel   eindstempel
          FROM   sap007 t06
          WHERE  t06.t06_eind_stempel > SYSDATE
          AND    t06.t06_soort_tabel  = p_soort_tabel
       UNION
          SELECT a.ROWID
          ,      a.t06_eind_stempel
          FROM   sap007 a       
          WHERE  t06_soort_tabel = p_soort_tabel
          AND    a.t06_eind_stempel = (SELECT b.t06_begin_stempel
                                       FROM   sap007 b
                                       WHERE b.t06_eind_stempel > SYSDATE
                                       AND   b.t06_soort_tabel  = a.t06_soort_tabel
                                       AND   b.t06_sector       = a.t06_sector
                                       AND   b.t06_code         = a.t06_code
                                       AND   b.t06_ingdat       = a.t06_ingdat);
    et

    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
     
    CURSOR c_sap003 (p_soort_tabel IN sap003.t03_soort_tabel%type) IS
          SELECT t03.ROWID
          ,      t03.t03_eind_stempel   eindstempel
          FROM   sap003 t03
          WHERE  t03.t03_eind_stempel > SYSDATE
          AND    t03.t03_soort_tabel  = p_soort_tabel
       UNION
          SELECT a.ROWID
          ,      a.t03_eind_stempel
          FROM   sap003 a       
          WHERE  t03_soort_tabel = p_soort_tabel
          AND    a.t03_eind_stempel = (SELECT b.t03_begin_stempel
                                       FROM   sap003 b
                                       WHERE b.t03_eind_stempel > SYSDATE
                                       AND   b.t03_soort_tabel  = a.t03_soort_tabel
                                       AND   b.t03_sector       = a.t03_sector
                                       AND   b.t03_code         = a.t03_code
                                       AND   b.t03_ingdat       = a.t03_ingdat);
    comme on peut le voir il y a flagrand deli de copiage.

    Est ce un defaut de language?? et on ne peut pas faire mieux ??
    comment refactorier un truc pareil.??
    y a t il un preprocesseur en plsql ou des templates ou des generics??
    Y a t il en plsql un moyen de creer des commandes a la volée (en text) et puis de dire au moteur d'interpreter et d'executer ce text??

    merci

    a++

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Citation Envoyé par elekis Voir le message
    Y a t il en plsql un moyen de creer des commandes a la volée (en text) et puis de dire au moteur d'interpreter et d'executer ce text??
    Oui, à l'aide d'EXECUTE IMMEDIATE.

  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
    Déjà quand je vois une sélection du ROWID ça me fait toujours un peu peur En effet, c'est une données techniques qui ne devrait avoir rien à faire dans des requêtes fonctionnelles.

    Sinon, j'vois rien de choquant à faire les mêmes requêtes sur 3 tables différentes. Si le but c'est de simplifier la lecture du code, pourquoi ne pas créer des vues ?

  4. #4
    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
    Et tu peux en effet t'inspirer de ceci : http://sheikyerbouti.developpez.com/...mmediate/#L4.4

    Un truc de 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    DECLARE
       TYPE T_ROWID is TABLE of ROWID;
       TYPE T_EINDSTEMPEL  is TABLE of DATE;
       T_rowids       T_ROWID ;
       T_eindstempels T_EINDSTEMPEL ;
       LC$Requete  VARCHAR2(256);
    BEGIN
      LC$Requete := '      SELECT t04.ROWID
          ,      t04.t04_eind_stempel   eindstempel
          FROM   <sap_table> t04
          WHERE  t04.t04_eind_stempel > SYSDATE
          AND    t04.t04_soort_tabel  = p_soort_tabel
       UNION
          SELECT a.ROWID
          ,      a.t04_eind_stempel
          FROM   <sap_table> a       
          WHERE  t04_soort_tabel = p_soort_tabel
          AND    a.t04_eind_stempel = (SELECT b.t04_begin_stempel
                                       FROM   <sap_table> b
                                       WHERE b.t04_eind_stempel > SYSDATE
                                       AND   b.t04_soort_tabel  = a.t04_soort_tabel
                                       AND   b.t04_sector       = a.t04_sector
                                       AND   b.t04_code         = a.t04_code
                                       AND   b.t04_ingdat       = a.t04_ingdat)
    ';
      EXECUTE IMMEDIATE REPLACE(LC$Requete, '<sap_table>', 'sap0004') BULK COLLECT INTO T_rowids, T_eindstempels;
    END ;

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Par défaut
    grand merci.

    orafrance : j'en ai mis que trois , mais j'en ai beaucoup beaucoup beaucoup plus... ( a croire que pour certains, CtrlV et CtrlC sont une religion).

    par contre, je comprend pas pourquoi pas de ROWID ???

    merci

    a++

  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
    le ROWID c'est l'adresse du bloc où trouver la donnée, rien qu'un update de la ligne peut le changer, ça n'a rien à faire dans une requête comme ça

    Sinon, que t'en est 3 ou 200 ne change rien, vaut mieux avoir 200 fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE REPLACE(LC$Requete, '<sap_table>', 'sap000x') BULK COLLECT INTO T_rowids, T_eindstempels;
    où x est le numéro de la table que 200 fois ton curseur non ?

    Et aussi, j'ai comme l'impression que le concepteur du MCD n'était pas au courant qu'on peut partitionner les tables

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Par défaut
    effectivement, je suis d'accord avec toi. (j'avais mal lu ta réponse).

    merci pour tout

    a++

  8. #8
    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
    Il y a divers raisons pour lequel un programmeur peut décider d'utiliser le RowID. Pour exemple ça reste toujours le moyen le plus rapide d'accéder à un enregistrement.
    Remplacer des requêtes statique en PL/SQL par des requête dynamique juste parce qu'ils sont similaires ce n'est pas une bonne idée, plutôt le contraire étant vrai.

  9. #9
    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
    Mais dans ce cas, ne prends-tu pas le risque que le ROWID change entre le FETCH et l'utilisation que tu fais de la valeur ?

    Et je suis d'accord, les requêtes dynamiques ne sont pas forcément adéquates, d'autant qu'il me semble que c'est juste une question de partitionnement de table qui n'a pas été fait

  10. #10
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 462
    Par défaut
    Citation Envoyé par orafrance Voir le message
    le ROWID c'est l'adresse du bloc où trouver la donnée, rien qu'un update de la ligne peut le changer
    Est-ce que tu fais ici allusion aux lignes migrées ? Si c'est bien ça, c'est faux, le ROWID ne change pas à cette occasion.

  11. #11
    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
    Ha oui, en effet... au temps pour moi. Mais je pensais aussi à ces cas : http://asktom.oracle.com/pls/asktom/...65509363630539

  12. #12
    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 orafrance Voir le message
    Mais dans ce cas, ne prends-tu pas le risque que le ROWID change entre le FETCH et l'utilisation que tu fais de la valeur ?
    ...
    Salut orafrance,

    Il suffit de verrouiller l'enregistrement à l'occasion du select, c'est un classique qui s'applique aussi dans ce cas.
    Cella ne veut pas dire que les programmeurs peuvent faire du n'importe quoi avec le Rowid.

  13. #13
    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
    En tout cas, comme je dis : "quand je vois une sélection du ROWID ça me fait toujours un peu peur". Ca veut pas dire que c'est à proscrire, juste qu'il faut l'utiliser avec tout le soin qui s'impose

  14. #14
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Par défaut
    Je suis entrain de regarder cela aussi.

    c'est meme super bizzare, c'est utilisé nul part . a se demander a quoi cela sert .

    a++

  15. #15
    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
    Les requêtes générées automatiquement par divers outils de développement, Oracle Forms par exemple, contient souvent le Rowid. Donc, si c’est une vielle application qui a été migré dans PL/SQL ça s’explique peut être. Mieux être prudent quand même.

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

Discussions similaires

  1. les curseurs en plsql et requete dynamique
    Par opensource dans le forum PL/SQL
    Réponses: 4
    Dernier message: 27/01/2010, 10h33
  2. Réponses: 2
    Dernier message: 06/12/2006, 09h09
  3. Firebird et les curseurs ?
    Par msuire dans le forum SQL
    Réponses: 5
    Dernier message: 10/06/2006, 13h01
  4. Problème avec les curseurs SQL SERVER
    Par stefostillrise dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2005, 13h09
  5. [C#] Pb avec les curseurs
    Par White_Angel dans le forum Windows Forms
    Réponses: 5
    Dernier message: 16/01/2005, 10h56

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