Bonjour,
Je travaille sous une base Oracle 7 et je crée dans une fonction stockée en PL/SQL une requête en dynamique
jusque là tout va bien, si je fais afficher ma requête, elle est bien construite, etc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 V_Qry := 'Insert into toto (chp1, chp2, etc)' ; V_Qry := V_Qry || ' select /*+ index(pos POS_STAT_PDSKM_IDX) */ '; V_Qry := V_Qry || ' chp1, chp2, etc from titi where 1=1 ' if A <> 'Non' then V_Qry := V_Qry || ' and chp1 = ' || Param end if;
Comme elle est un tantinet consommatrice (genre plus d'une heure pour passer), je l'ai optimisée en créant les indexes adéquat et en mettant donc un hint dans ma requête pour forcer le passage par cet index.
Quand je la lance "à la main", tout va bien, mon hint est bien interprété, je passe par l'index, j'ai la réponse en moins de 3 minutes.
Quand je passe par ma fonction stockée avec le code suivant :
Alors là, rien ne va plus, le plan d'exécution redeviens celui pourris que j'avais avant de mettre le hint ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 C_DbmsSql := dbms_sql.open_cursor; dbms_sql.parse (C_DbmsSql, V_Qry,2); R_DbmsSql :=dbms_sql.execute (C_DbmsSql);
Donc on dirais bien que dbms_sql n'interprète pas les hints et les fait donc sauter ???
Du coup je ne sais pas quoi faire, car je n'ai pas d'autre moyen d'optimiser ...
J'ai chercher un peu partout notamment sur métalink, mais rien trouvé.
Alors je croise les doigts et je lance ici ma bouteille à la mer.
Merci de me répondre, même un petit début de piste ou d'idée est la bienvenue.
Partager