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

Oracle Discussion :

[Oracle 10] Vue materialisée appelant autre vue


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut [Oracle 10] Vue materialisée appelant autre vue
    Bonjour,

    Version Oracle 10.2.0.3.0


    J'ai plusieurs soucis que j'essaye de régler en créant une vue matérialisée.

    Lorsque je lance la commande de création de ma vue, cette dernière boucle indéfiniement.
    Via Sql Developer, en utilisant l'interface de creation de vue materialisée lorsque je demande de tester la syntaxe, il m'indique relation TGN introuvable. Et si je valide quand même la création, il ne me rend pas la main.

    La vue fonctionne très bien en non materialisée.

    La structure de ma vue est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH TGN AS (
      -- Requete recursive avec utilisation de level, sys_connect_by_path et fonction analytique (
    )
    SELECT champs
    FROM Table T
       JOIN TGN TGN1 ON condition
       JOIN TGN TGN2 ON condition

    J'ai essaye de remplacer le bloc WITH par une autre vue.
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT champs
    FROM Table T
       JOIN VUE_TGN TGN1 ON condition
       JOIN VUE_TGN TGN2 ON condition
    Avec le même message d'erreur sur VUE_TGN.
    Idem si je fais un simple SELECT * from VUE_TGN
    Je précise que j'ai crée mes vues avec le même utilisateur que celui souhaitant creer la vue matérialisée.


    J'ai donc tenté de continuer en supprimant l'utilisation de la VUE et du WITH en remplaçant les VUE_TGN par la requete associée.
    Cette fois il me jette avec un Fonction (null) inconnue ou non prise en charge. Une fois la fonction analytique retirée min(path) keep(dense_rank last order by l) path, cette fois l'analyse de syntaxe est ok.

    Mes premières questions donc :
    - Il y a t-il des restrictions sur les vues materialisées ? De même ma clause ORDER BY ne lui plait pas (même si cela est moins genant).
    - Pourquoi n'accepte-t-il pas l'appel à mes vues dans la vue materialisée ?


    Question bonus :
    Tout cela sert à un appel via du Pro*C.

    J'observe un comportement bizarre qui est que si j'appele mon Pro*C en ciblant une table dans laquelle j'ai insere les données de ma vue (non materialisée du coup), toutes les lignes sont bien remontées (j'ai un SELECT sans clause WHERE dans mon Pro*C)
    Par contre si mon SELECT porte sur la vue, il ne me remonte pas toutes les lignes et prend presque 10minutes à traiter ma requete (alors que la vue remonte les données en quelques secondes).

    Je ne comprends pas du tout ce comportement et en désespoir de cause j'ai tenté de faire une vue materialisée pour espérer contourner le problème.


    Merci d'avance pour vos idées

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    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 461
    Par défaut
    Citation Envoyé par Drizzt [Drone38] Voir le message
    ...Il y a t-il des restrictions sur les vues materialisées ?
    Oui, toute une palanquée, qui sont répertoriées dans la doc.
    Mais ces restrictions dépendent d'une part des options de création (notamment le mode de rafraîchissement), et d'autre part des éléments apparaissant dans le SELECT associé.
    Donc pour être concret, il faut vraiment nous fournir l'instruction complète de création de votre vue matérialisée.

  3. #3
    Membre chevronné Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Donc pour être concret, il faut vraiment nous fournir l'instruction complète de création de votre vue matérialisée.
    Absolument, sinon on est dans le flou.

    @+
    Rémi

  4. #4
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Merci pour vos réponses.

    Voici ma requete (que j'ai banalisée, j'espère ne pas avoir fait d'erreur en modifiant certains nom de champs et tables).

    Je n'ai pour l'instant par encore regardé le mode de rafraichissement, à priori ça serait à la demande.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    CREATE MATERIALIZED VIEW VUE_MATERIALISEE ("CHAMP_STR1", "CHAMP_FLAG", "CHAMP_NUM1", "CHAMP_STR3", "CHAMP_NUM2", "CHAMP_STR4", "DATE_DEBUT_STR", "DATE_DEBUT", "DATE_FIN_STR", "DATE_FIN") 
    TABLESPACE TAB_XXX
    AS 
    WITH TGN AS (
      SELECT TGN_STR, min(path) keep(dense_rank last order by l) path, max(l) l 
        FROM (
              select TGN_STR, level l, SYS_CONNECT_BY_PATH(TGN_STR, '|') path 
                from TABLE_TGN_STR 
             connect by prior TGN_STR=TGN_STR_PERE
            ) 
        GROUP BY TGN_STR
    )
    SELECT CHAMP_STR1, CHAMP_FLAG, dense_rank() over(partition by CHAMP_STR1, CHAMP_FLAG order by CHAMP_NUM1) CHAMP_NUM1, CHAMP_STR3, CHAMP_NUM2, CHAMP_STR4, date_debut_str, date_debut, date_fin_str, date_fin
    FROM
    (
        SELECT CHAMP_STR1 CHAMP_STR1,
               DECODE(CHAMP_FLAG, 'E', 0, 1) CHAMP_FLAG,
               100-10*(decode(instr(TGN1.path, act.TGA),0,0,instr(TGN1.path, act.TGA)-2))/4 +
               1000-100*(decode(instr(TGN2.path, act.TGB),0,0,instr(TGN2.path,act.TGB)-2))/4 +
               1000*tgn1.l + 
               10000*tgn2.l +
               DECODE(INFO, NULL, 4, 0) + 
               DECODE(act.C1, 
                      NULL, 3, 
                      DECODE(act.C2, 
                             NULL, 2,
                             DECODE(act.C3, NULL, 1, 0))
                      ) CHAMP_NUM1,
               TRIM(RPAD(act.C6, 4)||
                   act.C5||
                   RPAD(tgn1.TGN_STR, 3)||
                   RPAD(tgn2.TGN_STR, 3)||
                   RPAD(NVL(act.C1, ' '), 5)||
                   RPAD(NVL(act.C2, ' '), 5)||
                   RPAD(NVL(act.C3, ' '), 5)||
                   RPAD(NVL(act.C4, ' '), 5)
               ) CHAMP_STR3,
               DECODE(INFO, NULL, 1, 0) CHAMP_NUM2, 
               CHAMP_STR4 CHAMP_STR4,
               TO_CHAR(DATE_DEBUT, 'YYYYMMDDHH24MISS') date_debut_str,
               DATE_DEBUT date_debut,
               TO_CHAR(DATE_FIN, 'YYYYMMDDHH24MISS') date_fin_str,
               DATE_FIN date_fin
          FROM TABLE_ACT ACT
                  -- On prend les TGN des associations ou leur ascendants uniquement. 
                  JOIN TGN TGN1 ON instr(TGN1.path, act.TGA) > 0
                  JOIN TGN TGN2 ON instr(TGN2.path, act.TGB) > 0
    ) ORDER BY CHAMP_STR1, CHAMP_FLAG, 3, CHAMP_STR3, date_debut;

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    EDIT : Mauvaise lecture.

    EDIT BIS : en même temps, cela pourrait aussi être une faute de frappe. Mon edit ci-dessus était lié au fait que j'avais interprété le 'ORDER BY l' comme un 'ORDER BY 1'. Êtes-vous sûr qu'il n'y a pas eu faute de frappe ? La syntaxe en erreur pourrait venir de là. Remplacez 'l' peut intuitif par 'niveau' ?

  6. #6
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Bonjour,

    Merci d'avoir pris le temps de lire la requete.
    Non il n'y a pas de faute de frappe, la requete fonctionne, il n'y a pas de souci de ce coté.
    C'est uniquement lorsque je souhaite la mettre en vue materialisée que cela ne fonctionne pas.

    Après je ne suis pas sur que la vue materialisée resolvera mon problème. Pro*C ne semble pas traiter les vues correctements, ce n'est pas dit que ce soit mieux avec les vues materialisées...

    Pour résumer ma problématique initiale, qui n'apparait pas clairement dans mon premier poste, c'est faire en sorte que Pro*C remonte le résultat de ma requête.
    Le but étant que ce soit Oracle qui fasse tout vu que Pro*C ne sait pas interpreter la majorité des commandes présentes dans la requete. Apparement une simple vue ne suffit pas vu que Pro*C se comporte alors de façon imprévisible (explosion de temps de traitements et résultat erroné).

Discussions similaires

  1. [PHP 5.0] MVC - une vue dans une autre vue?
    Par caema dans le forum Langage
    Réponses: 3
    Dernier message: 16/12/2013, 12h10
  2. [CakePHP] include une vue dans une autre vue
    Par koloban dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 17/05/2013, 11h47
  3. Réponses: 8
    Dernier message: 10/02/2011, 23h06
  4. Réponses: 4
    Dernier message: 30/07/2009, 09h56
  5. [Oracle 9] Vue materialisée indexée et optimisation
    Par scornille dans le forum Oracle
    Réponses: 4
    Dernier message: 18/11/2005, 15h11

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