Bonjour,

Je cherche a optimiser la fonction suivante:
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
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?