Je ne sais pas pourquoi vous vous embêtez avec le with
clause, c'est plus simple sans CTE; il vous suffit d'identifier à quelle table correspond la city
la colonne est dans :
function myfunc(p_city IN VARCHAR2,
p_order IN VARCHAR2)
RETURN SYS_REFCURSOR IS
v_result SYS_REFCURSOR;
begin
OPEN v_result FOR
'select * from tableA ta
inner join tableB tb on tb.some_col = ta.some_col
where :p_city is null or LOWER(ta.city) like ''%''||:p_city||''%''
order by ' || p_order || ' asc'
using p_city, p_city;
return v_result;
end myfunc;
/
J'ai deviné que c'est la table A, changez simplement l'alias si c'est l'autre. Vous devez également spécifier la condition de jointure entre les deux tables. (Aussi remarqué que j'ai ajouté un espace avant asc
pour arrêter la concaténation dans la chaîne de tri).
Cela compile sans erreur; lors de l'exécution, j'obtiens ORA-00942:la table ou la vue n'existe pas, ce qui est raisonnable. Si je crée des données factices :
create table tablea (some_col number, city varchar2(30));
create table tableb (some_col number);
insert into tablea values (1, 'London');
insert into tablea values (2, 'Londonderry');
insert into tablea values (3, 'East London');
insert into tablea values (4, 'New York');
insert into tableb values (1);
insert into tableb values (2);
insert into tableb values (3);
insert into tableb values (4);
puis l'appeler obtient :
select myfunc('lond', 'city') from dual;
SOME_COL CITY SOME_COL
---------- ------------------------------ ----------
3 East London 3
1 London 1
2 Londonderry 2
Si vous voulez vraiment vous en tenir au CTE pour une raison quelconque, alors (comme l'a dit @boneist) cela doit faire partie de la déclaration dynamique :
OPEN v_result FOR
'with all_prb as (
select * from tableA ta
inner join tableB tb on tb.some_col = ta.some_col
)
select * from all_prb ff
where :p_city is null or LOWER(ff.city) like ''%''||:p_city||''%''
order by ' || p_order || ' asc'
using p_city, p_city;