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 habitué

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    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 confirmé

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    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 sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    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 sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    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 habitué

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    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 sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    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 habitué

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

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

    merci pour tout

    a++

  8. #8
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    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 sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    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 460
    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 460
    Points : 8 074
    Points
    8 074
    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.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    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 éminent sénior 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
    Points : 11 252
    Points
    11 252
    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 sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    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 habitué

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    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 éminent sénior 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
    Points : 11 252
    Points
    11 252
    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