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 :

Supprimer un result_cache


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Supprimer un result_cache
    Bonjour à tous,

    Est-ce que quelqu'un sait comment peut-on enlever un result_cache ?
    Je sais que vider tout le cache se fait par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute dbms_result_cache.flush
    mais ceci vide le buffer entièrement!!
    Je peux acceder à la vue contenant mon résultat (v$result_cache_objects).
    Mais je ne peux pas le supprimer à partir de cette vue.

    Merci.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut Presque !
    Bonjour,

    Vous avez regarde ou pour trouver DBMS_RESULT_CACHE.FLUSH ? Dans la doc?
    Parce que juste en-dessous, il y avait la reponse:
    http://download.oracle.com/docs/cd/B...e.htm#CDEFHHAJ
    Dans la partie summary of dbms_result_cache sub-programs

    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
     
    create or replace function tmp_func (n number) return varchar2 result_cache is
    begin
       dbms_lock.sleep(1);
    return 'toto-'||n;
    end;
    /
    show errors
    set timing on
    set serveroutput on
    exec dbms_result_cache.flush;
    prompt On attends une seconde que lors du premier appel de la fonctio
    exec dbms_output.put_line(tmp_func(42));
    exec dbms_output.put_line(tmp_func(42));
    exec dbms_output.put_line(tmp_func(12));
    exec dbms_output.put_line(tmp_func(12));
    exec dbms_output.put_line(tmp_func(42));
    Select id
         , type
         , status
         , name
         , namespace
         , object_no
      from v$result_cache_objects
     order by id
    /
    prompt invalidating result_cache of 42
    exec dbms_result_cache.invalidate_object(1);
    exec dbms_output.put_line(tmp_func(42));
    exec dbms_output.put_line(tmp_func(12));
     
    prompt invalidate all results cache related to tmp_func
    exec dbms_result_cache.invalidate(USER,'TMP_FUNC');
    exec dbms_output.put_line(tmp_func(42));
    exec dbms_output.put_line(tmp_func(12));

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Rams7s Voir le message
    Bonjour,
    Vous avez regarde ou pour trouver DBMS_RESULT_CACHE.FLUSH ? Dans la doc?
    [/code]
    Merci pour votre réponse,
    En fait, j'ai déjà regardé cela, mais je vois pas à quel niveau il parle de la suppression d'un objet result cache?

    Pouvez vous m'expliquer ce code que vous m'avez envoyé?
    Je suis perdue

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Ben la suppression de l'objet en cache, c'est les fonctions/procedures en invalidate. Quand c'est invalide, c'est que le resultat n'est plus bon. Il est annule, infirme, invalide, rendu non-valide...

    Dans l'exemple que je vous ai fournis, il se passe les choses suivantes:
    1. On cree une fonction PL/SQL avec result_cache. Cette fonction contient un sleep d'une seconde
    2. Ensuite, on efface tout le cache. C'est surtout histoire de ne pas se tromper de numero apres
    3. On execute plusieurs fois la fonction, avec des arguments differents. Seule la premiere execution a un temps d'execution de 1s (on le voit grace au set timing on)
    4. On regarde la liste des choses en cache
    5. Et on efface un des objets du cache. C'est le numero 1, 0 etant la fonction et 2 le second resultat mis en cache (argument de la fonction:12)
    6. Du coup, quand on re-execute al fonction avec l'argument 42, elle remet une seconde car le resultat n'est plus dans le cache
    7. Alors que avec 12 en argument, la fonction s'execute instantanement
    8. Dans un second temps, on efface tous les resultats cache qui ont rapport avec la fonction cree precedement
    9. Ce qui fait que quand on re-execute la fonction, on attend une seconde quelque soit l'argument

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Ok, j'avais pas pigé le sens de rendre un objet invalide.. maintenant c bcp mieux.
    Je vais essayer d'adapter mon code

    Merci ^^

  6. #6
    Candidat au Club
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Salut,
    J'ai essayé une procédure pour vider le cache element par element.
    J'inserts un hint dans mes requêtes dont je cache le résultat pour pouvoir les trouver dans le cache (v$result_cache_objects)

    Or, j'ai un problème de compilation, qu'est-ce qui ne va pas dans ce code?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace function free1 (name  varchar2) return number is
    	idrc number ;
    begin
    	select id into idrc from v$result_cache_objects where name like '%'||name||'%';
    	Return idrc;
    end;
    /
     
    exec dbms_result_cache.invalidate_object(free1('/*Q1*/'));
    là je suppose que mon résultat contient un hint :/*Q1*/
    Merci

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Sans le message d'erreur ce n'est pas simple.

  8. #8
    Candidat au Club
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Rams7s Voir le message
    Sans le message d'erreur ce n'est pas simple.
    Cela retourne :
    table ou vue inexistante

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Petit truc de methode:
    Moi quand je compile et qu'il y a un probleme, le compilateur m'indique la ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TMP@minilhc >show errors
    Errors for FUNCTION FREE1:
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    4/2      PL/SQL: SQL Statement ignored
    4/27     PL/SQL: ORA-00942: table or view does not exist
    Genre la, il me donne la meme erreur que vous, a la ligne 4. Ben ca veut dire que le petit select ne fonctionne pas. Il me manque le droit de faire un select sur la table V$result_cache_objects.

    Note: Pour donner l'acces, cela se fera sur v_$result_cache_objects

    Si vous debutez et que vous allez travailler quelques temps sur oracle et le PL/SQL, je vous recommande vivement le guide 2 jours PL/SQL developpeur. Ca se trouve sur le site d'oracle, et ca apprends tout pleins de trucs. On perd deux ou trois jours au debut a se prendre la tete pour comprendre les grandes lignes vu qu'il y a beaucoup beaucoup de choses, mais on gagne du temps au quotidien apres.

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. [VB6] Api pour supprimer dans un fichier INI
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 20/02/2003, 08h16
  3. Supprimer la premiere ligne d'un fichier
    Par Kahiba dans le forum Langage
    Réponses: 7
    Dernier message: 11/02/2003, 10h18
  4. Supprimer un élément d'un tableau
    Par CaptainChoc dans le forum Langage
    Réponses: 15
    Dernier message: 23/12/2002, 23h14
  5. [VB6] Supprimer un enregistrement dans une ListView ??
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/11/2002, 09h37

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