Bonjour,
Je cherche a optimiser la fonction suivante:
Comme vous pouvez le remarquer dans mon curseur je repete 2 fois la meme sous requete (mis en vert).
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; /
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?
Partager