Bonjour,

Je fais des insertions en utilisant les fonctions Pipelined. J'insère à partir d'une table source T_SOURCE vers une table cible T_CIBLE, qui ont la structure suivante:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
CREATE TABLE T_SOURCE (entite char(10), memo char(1000));
CREATE TABLE T_CIBLE (entite char(10), seq number(4,0), memo char(1000));
(PK de la table T_CIBLE est entite,seq)

La commande pour insérer est la suivante:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
BEGIN
	INSERT  /*+ PARALLEL(t, 10) */
	INTO    T_CIBLE t
	SELECT  *
	FROM    TABLE(
				MyPackage_1.PIPE_CIBLE ( SYSDATE,
								     CURSOR(SELECT /*+ PARALLEL(p, 10) */ * FROM T_SOURCE p)));
EXCEPTION
WHEN OTHERS THEN
	/*SORTIR EN ERREUR*/
END;
A l'intérieur de ma fonction PIPE_CIBLE, je dois calculer moi-même la séquence qui va être insérée dans T_CIBLE (pour éviter PK), pour ça je suis obligé de faire:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
SELECT  NVL(MAX(seq), 0) + 1
INTO    t_cible_record.seq
FROM    T_CIBLE
WHERE   entite = t_cible_record.entite;
Mais je rencontre le problème de table mutante, vu que j'insère dans T_CIBLE et en même temps j'essaie de faire un SELECT sur la même table !!

Je cherche donc à savoir quel est le moyen le plus performant pour calculer ma séquence sans avoir de contrainte PK.

Merci d'avance