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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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