Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/06/2011, 18h03   #1
Invité de passage
 
Inscription : juin 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 6
Points : 1
Points : 1
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 :
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.
Sun22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 09h55   #2
Membre expérimenté
 
François
Inscription : février 2010
Messages : 305
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 305
Points : 535
Points : 535
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 :
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));
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 01/07/2011, 11h23   #3
Invité de passage
 
Inscription : juin 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 6
Points : 1
Points : 1
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
Sun22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 11h39   #4
Membre expérimenté
 
François
Inscription : février 2010
Messages : 305
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 305
Points : 535
Points : 535
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
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 01/07/2011, 11h51   #5
Invité de passage
 
Inscription : juin 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 6
Points : 1
Points : 1
Ok, j'avais pas pigé le sens de rendre un objet invalide.. maintenant c bcp mieux.
Je vais essayer d'adapter mon code

Merci ^^
Sun22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 20h08   #6
Invité de passage
 
Inscription : juin 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 6
Points : 1
Points : 1
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 :
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
Sun22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 11h06   #7
Membre expérimenté
 
François
Inscription : février 2010
Messages : 305
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 305
Points : 535
Points : 535
Sans le message d'erreur ce n'est pas simple.
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 15h15   #8
Invité de passage
 
Inscription : juin 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par Rams7s Voir le message
Sans le message d'erreur ce n'est pas simple.
Cela retourne :
table ou vue inexistante
Sun22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 15h03   #9
Membre expérimenté
 
François
Inscription : février 2010
Messages : 305
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 305
Points : 535
Points : 535
Petit truc de methode:
Moi quand je compile et qu'il y a un probleme, le compilateur m'indique la ligne.
Code :
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.
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h50.


 
 
 
 
Partenaires

Hébergement Web