Bonjour à tous,

Je m'excuse d'avance pour la potentielle "newbitude" de mon problème Mon besoin est simple : je souhaiterais construire un select dynamique à partir d'une fonction pl. L'argument de cette fonction serait une chaine de caractères qui représenterait la clause where du select. J'aimerais arriver à qqchose comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
select * from table(my_pkg.get_employee_by_where('e_mail like ''%pop%'''));
Voici le bout de code que j'ai implémenté (je passe par un "bête" bulk collect):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
function get_employee_by_where(aWhere varchar2) return n_employee is
    type myRefCur is ref cursor;
    myCur  myRefCur;
    myNEmp n_employee;
  begin
    open myCur for 'select objid from table_employee where ' || aWhere;
    fetch myCur bulk collect
      into myNEmp;
    close myCur;
    return myNEmp;
  end get_employee_by_where;
table_employee.objid est de type number. Si je crée le type n_employee comme une table de number, tout se déroule correctement : la requête du dessus me renvoie des résultats, jusque là tout va bien !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
create or replace type n_employee as table of number;
Par contre, dès que j'essaie de renvoyer plus d'éléments dans mon tableau avec la création d'un type spécifique (t_employee), le bulk collect me renvoie une erreur "ORA-00932 expected UDT got number".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
create or replace type t_employee as object (objid number);
create or replace type n_employee as table of t_employee;
Et là j'avoue que je sèche... Je n'arrive pas bien à voir la différence entre les deux implémentations.
Je vois qu'il y a plusieurs manières de construire un tableau mais cette méthode me semblait etre la plus facile.

Merci d'avance !
++
Pop

NB : Pour la version Oracle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
select * from v$version where rownum = 1;
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi