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:
(PK de la table T_CIBLE est entite,seq)
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));
La commande pour insérer est la suivante:
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
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;
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 !!
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;
Je cherche donc à savoir quel est le moyen le plus performant pour calculer ma séquence sans avoir de contrainte PK.
Merci d'avance
Partager