Bonjour à tous,

Oracle9i Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
OS : windows 2000 server

je cherche à insérer des données dans une table à partir d'une TABLE DE RECORDS en utilisant le SQL DYNAMIQUE et FORALL

Insulte rencontrée :

ERREUR à la ligne 75 :
ORA-06550: Ligne 75, colonne 51 :
PLS-00436: restriction de mise en oeuvre : impossible de référencer des champs
d'une table d'enregistrements BULK In-BIND
ORA-06550: Ligne 75, colonne 6 :
PL/SQL: Statement ignored
un peu de code
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
DECLARE
--//--RECORD
TYPE T_LQ_REC IS RECORD (
     LQ_VLAB_SEQ VARIANCE_LABORATOIRE.VLAB_SEQ%TYPE,
     LQ_ESS_ID ESSAI.ESS_ID%TYPE,
     LQ_PARA_ID PARAMETRES.PARA_ID%TYPE,
     LQ_MATR_ID MATRICE.MATR_ID%TYPE,
     LQ_LOT_ID LOT.LOT_ID%TYPE,
     LQ_METH_ID METHODES.METH_ID%TYPE,
     LQ_POINT_ID RESULTATS.POINT_ID%TYPE,
     LQ_VLAB_MOYENNE VARIANCE_LABORATOIRE.VLAB_MOYENNE%TYPE,
     LQ_VLAB_SRESIDUELLE VARIANCE_LABORATOIRE.VLAB_SRESIDUELLE%TYPE,
     LQ_VLAB_SINTERFLACONS VARIANCE_LABORATOIRE.VLAB_SINTERFLACONS%TYPE,
     LQ_VLAB_SELECTION VARIANCE_LABORATOIRE.VLAB_SELECTION%TYPE,
     LQ_VLAB_LQ VARIANCE_LABORATOIRE.VLAB_LQ%TYPE,      
     LQ_VLAB_MINF VARIANCE_LABORATOIRE.VLAB_LQ_MINF%TYPE,
     LQ_VLAB_MSUP VARIANCE_LABORATOIRE.VLAB_LQ_MSUP%TYPE);
 
T_LE_LQ T_LQ_REC;
 
TYPE T_LQ_TAB IS TABLE OF T_LQ_REC;
T_LES_LQ T_LQ_TAB:=T_LQ_TAB();
 
BEGIN
 
--J'alimente mon tableau de records à ce niveau, pas de pb, mon tableau est bien rempli
 
T_LES_LQ(cpt):=T_LE_LQ;
 
--Après plusieurs traitements, j'ai à ce niveau un tableau complet de records que je voudrai insérer le plus efficacement possible dans une table.
 
--Pour cela, voici ce que je fais
chInsert:='INSERT INTO VARIANCE_LABORATOIRE(VLAB_SEQ, ';
chInsert:=chInsert||'ESS_ID, ';
chInsert:=chInsert||'PARA_ID, ';
chInsert:=chInsert||'MATR_ID, ';
chInsert:=chInsert||'LOT_ID, ';
chInsert:=chInsert||'METH_ID, ';
chInsert:=chInsert||'POINT_ID, ';
chInsert:=chInsert||'VLAB_MOYENNE, ';
chInsert:=chInsert||'VLAB_SRESIDUELLE, ';
chInsert:=chInsert||'VLAB_SINTERFLACONS, ';
chInsert:=chInsert||'VLAB_SELECTION, ';
chInsert:=chInsert||'VLAB_LQ,VLAB_LQ_MINF,VLAB_LQ_MSUP) ';
chInsert:=chInsert||'VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14)';
 
FORALL i IN T_LES_LQ.FIRST..T_LES_LQ.LAST
     EXECUTE IMMEDIATE chInsert USING T_LES_LQ(i).LQ_VLAB_SEQ,
            T_LES_LQ(i).LQ_ESS_ID,
            T_LES_LQ(i).LQ_PARA_ID,
            T_LES_LQ(i).LQ_MATR_ID,
            T_LES_LQ(i).LQ_LOT_ID,
            T_LES_LQ(i).LQ_METH_ID,
            T_LES_LQ(i).LQ_POINT_ID,
            T_LES_LQ(i).LQ_VLAB_MOYENNE,
            T_LES_LQ(i).LQ_VLAB_SRESIDUELLE,
            T_LES_LQ(i).LQ_VLAB_SINTERFLACONS,
            T_LES_LQ(i).LQ_VLAB_SELECTION,
            T_LES_LQ(i).LQ_VLAB_LQ,
            T_LES_LQ(i).LQ_VLAB_MINF,
            T_LES_LQ(i).LQ_VLAB_MSUP;
 
END;
Et me fais jeter !! si je fais l'insertion sans passer par une variable compteur (ici i) çà marche !!

exemple :


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
 
EXECUTE IMMEDIATE chInsert USING T_LES_LQ(1).LQ_VLAB_SEQ,
            T_LES_LQ(1).LQ_ESS_ID,
            T_LES_LQ(1).LQ_PARA_ID,
            T_LES_LQ(1).LQ_MATR_ID,
            T_LES_LQ(1).LQ_LOT_ID,
            T_LES_LQ(1).LQ_METH_ID,
            T_LES_LQ(1).LQ_POINT_ID,
            T_LES_LQ(1).LQ_VLAB_MOYENNE,
            T_LES_LQ(1).LQ_VLAB_SRESIDUELLE,
            T_LES_LQ(1).LQ_VLAB_SINTERFLACONS,
            T_LES_LQ(1).LQ_VLAB_SELECTION,
            T_LES_LQ(1).LQ_VLAB_LQ,
            T_LES_LQ(1).LQ_VLAB_MINF,
            T_LES_LQ(1).LQ_VLAB_MSUP;
kelke chose m'échappe !! FORALL ne serait-il point adapté pour des types RECORDS !!!

Merci de votre aide

@