J'ai une table TRANSAC qui contient des transactions et une table TRANSAC_DETAIL qui contient les détails des transactions. Elles sont liées par l'id TRANSAC_ID. J'ai besoin d'effectuer plusieurs requêtes pour chacunes des transactions (ou presque). Les deux tables sont énormes (plusieurs millions de lignes). Pour une question de performance je voudrais récupérer tous les détails de la transaction courante dans une table temporaire ("l_transac") et faire mes requêtes dessus (plutôt que sur la table TRANSAC_DETAIL). Voici mon 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
DECLARE
    TYPE transac_aat IS TABLE OF TRANSAC_DETAIL%
    l_transac transac_aat;
BEGIN
    FOR trans IN ( SELECT TRANS_ID, TAX_CODE
                        FROM TRANSAC
                        WHERE DISPATCH_CODE3='2SPLIT' )
    LOOP
        SELECT *
        BULK COLLECT INTO l_transac
        FROM TRANSAC_DETAIL
        WHERE TRANS_ID=trans.TRANS_ID;
 
        FOR line IN (SELECT *
                         FROM TABLE(CAST(l_transac AS transac_aat)) )
        LOOP
 
            [ ... ]
 
        END LOOP;
 
            [ .... ]
 
    END LOOP;
END;
Je récupère une erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
ORA-06550: Ligne 38, colonne 59 :
PL/SQL: ORA-00902: type de données non valide
ORA-06550: Ligne 38, colonne 21 :
PL/SQL: SQL Statement ignored
Le type "transac_aat" n'est pas accepté dans la cast.

Une idée du pourquoi?

Oracle: 10.2.0.4