Bonjour à tous,
Contexte :
Je cherche à développer une procédure qui génère des requêtes de sélection puis les exécute et renvoie le résultat obtenu.
La table sur laquelle la requête va être exécutée n'est pas connu à l'avance, le nombre de tuple retournée par la requête va de 0 à plusieurs.
Synoptique de mon traitement :
Les éléments nécessaires à la génération de la requête (SELECT, FROM et WHERE) sont passés en paramètre et ma requête est correctement générée en chaîne de caractères afin d'être exécutée via EXECUTE IMMEDIATE.
Le résultat obtenu est stocké dans une instance d'un objet ot_table défini comme ci-dessous (ot_table1 et ot_table2 sont à l'image de deux tables) :
En l'état actuel de mon dév j'obtiens le message d'erreur suivant lors de la compilation :
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 CREATE TYPE ot_table1 AS OBJECT ( champ1 NUMBER(10), champ2 NUMBER(1), champ3 NUMBER(2) ); / CREATE TYPE ot_table2 AS OBJECT ( champ1 NUMBER(10), champ2 NUMBER(1), champ3 NUMBER(2) ); / CREATE TYPE arr_table1 AS TABLE OF ot_table1; / CREATE TYPE arr_table2 AS TABLE OF ot_table2; / CREATE TYPE ot_tables AS OBJECT ( tbl_table1 arr_table1, tbl_table2 arr_table2 ); / FUNCTION FCT_select(i_tblSelects IN arr_tblSetters, i_tblConditions IN arr_tblConditions, i_table IN VARCHAR2) RETURN ot_tables IS l_signature VARCHAR(1000) := 'PCK_GACDataAccess.FCT_select'; l_query VARCHAR2(5000) := NULL; l_increment NUMBER(3) := 1; l_tables ot_tables := ot_tables(NULL, NULL); BEGIN l_query := 'BEGIN SELECT '; l_query := FCT_genererListeChamps(l_query, i_tblSelects); --l_query := l_query||' BULK COLLECT INTO :1'; l_query := l_query||' FROM '||i_table; l_query := FCT_genererClauseWhere(l_query, i_tblConditions); l_query := l_query||'; END;'; print_out(l_query); IF UPPER(i_table) = UPPER('Table1') THEN dbms_output.put_line('test 1'); --EXECUTE IMMEDIATE l_query INTO l_tables.tbl_table1; EXECUTE IMMEDIATE l_query BULK COLLECT INTO l_tables.tbl_table1; dbms_output.put_line('test 2'); dbms_output.put_line('Identifiant récupéré : '||l_tables.tbl_table1(0).champ1); dbms_output.put_line('test 3'); ELSIF UPPER(i_table) = UPPER('Table2') THEN EXECUTE IMMEDIATE l_query BULK COLLECT INTO l_tables.tbl_table2; END IF; RETURN l_tables; EXCEPTION WHEN OTHERS THEN print_out(l_query); RAISE_APPLICATION_ERROR(-20101, l_signature||' '||SQLERRM(SQLCODE)); END FCT_select;
Si j'utilise la façon de procéder qui est commentée et que j'ai volontairement laissé dans le corps de la procédure FCT_select, j'obtiens lors de l'exécution du traitement :PLS-00103: Symbole "BULK" rencontré à la place d'un des symboles suivants :
. < * @ % & = - + ; < / > etc...Je pense que mon soucis repose principalement l'utilisation du BULK COLLECT alors qu'il y a plusieurs champs dans le SELECT. Les exemples que je trouve sur le web n'ont qu'un seul champ dans le SELECT.ORA-20101: PCK_GACDataAccess.FCT_select ORA-01008: Toutes les variables ne sont pas liées.
Quelqu'un pourrait me donner un coup de main ?
Partager