Bonjour à tous,

Je débute sous pl/sql (merci aux didacticiel developpez.com ) mais j'ai un petit problème de performance.

Je veux créer une table temporaire sur la base d'une table existante mais en transformant certains champs. Ces transformations sont lourdes et compliquées et je n'arrivais pas à m'en sortir avec du simple SQL.

J'ai donc créé un bloc PL/SQL pour mettre à jour mes lignes, voici le code que j'ai utilisé :
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
DECLARE 
   CURSOR table_cp IS SELECT * FROM tmp;
   employe tmp%ROWTYPE;
 
   nv_num_eng varchar2(7);
 
   Function nouv_num_eng (old_num_eng IN varchar2) return varchar2
	is
	   nouv_num varchar2(7);
	Begin
                      -- TRAITEMENT
                     return nouv_num ;
	end;
 
BEGIN
    FOR employe IN table_cp
    LOOP
	nv_num_eng := nouv_num_eng (employe.eceb_num);
        UPDATE tmp
	SET 
           ceng_cod=nv_num_eng           
        WHERE eceb_num=employe.eceb_num;
            END LOOP;
commit;
 
END;
Mais c'est très long à l'exécution, mais je suis sûr que l'on peut l'optimiser. J'ai essayé de faire le traitement lors de l'insert (fait en SQL) mais il me dit qu'il n'est pas possible d'appeller un fonction PL/SQL dans une instruction SQL. J'ai essayé de manipuler uniquement le CURSOR et ses champs, mais je n'y arrive pas.

Quelqu'un pourrait me donner un coup de pouce ?

Merci d'avance