[Oracle-optimisation] requete recursive complique dans une fonction
Bonjour,
Je cherche a optimiser la fonction suivante:
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 36 37 38 39 40 41 42
| CREATE OR REPLACE FUNCTION SERVICES (N_NAME in VARCHAR2)
RETURN LIST_SERVICE PIPELINED
IS
RES SERVICE_CUSTOMER := SERVICE_CUSTOMER(null,null,null); -- service customer est une table de type (SERVICE_TYPE_NAME, SERVICE_NAME, CUSTOMER_NAME)
CURSOR C_LIST_SERVICE IS
select distinct ST.NAME as SERVICE_TYPE_NAME, S.service_name as SERVICE_NAME, S.customer_name as CUSTOMER_NAME
from Service S, service_type ST,
(
select RCS.service_id
from REL_CIRCUIT_SERVICE RCS
where RCS.circuit_id in
(
select RCC.OVERLYING_CIRCUIT_ID
from REL_CIRCUIT_CIRCUIT rcc
start with RCC.UNDERLYING_CIRCUIT_ID in (
select circuit_id
from CIRCUIT C, NETWORK N
where N.N_id = C.N_id
N.name = N_NAME)
connect by prior RCC.OVERLYING_CIRCUIT_ID = RCC.UNDERLYING_CIRCUIT_ID
)
UNION
select RCS.service_id
from REL_CIRCUIT_SERVICE RCS
where RCS.circuit_id in (
select circuit_id
from CIRCUIT C, NETWORK N
where N.N_id = C.N_id
N.name = N_NAME)
) All_Service
where S.service_type_id = ST.service_type_id
and S.service_id = All_Service.service_id;
BEGIN
for serv_custo in C_LIST_SERVICE loop
RES.SERVICE_TYPE_NAME := serv_custo.SERVICE_TYPE_NAME;
RES.SERVICE_NAME := serv_custo.SERVICE_NAME;
RES.CUSTOMER_NAME := serv_custo.CUSTOMER_NAME;
PIPE ROW (RES);
end loop;
return;
END;
/ |
Comme vous pouvez le remarquer dans mon curseur je repete 2 fois la meme sous requete (mis en vert).
J'aurai voulu savoir si dans la fonction je ne pouvais pas executer cette requete avec jointure avant l'appel du curseur, mettre le resultat dans une table temporaire et appeler cette table temporaire plutot que d'effectuer la requete deux fois de suite.
Est-ce que c'est possible? Si ca l'est, comment puis-je le faire?