No estoy seguro de por qué te molestas con with
cláusula, es más sencillo sin un CTE; solo necesita identificar en qué tabla la city
la columna está en:
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;
/
Supuse que es la tabla A, solo cambia el alias si es la otra. También debe especificar la condición de unión entre las dos tablas. (También noté que agregué un espacio antes de asc
para evitar que se concatene en la cadena order-by).
Esto compila sin errores; cuando ejecuto obtengo ORA-00942:la tabla o la vista no existe, lo cual es razonable. Si creo datos ficticios:
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);
luego llamarlo obtiene:
select myfunc('lond', 'city') from dual;
SOME_COL CITY SOME_COL
---------- ------------------------------ ----------
3 East London 3
1 London 1
2 Londonderry 2
Si realmente quiere seguir con el CTE por alguna razón, entonces (como dijo @boneist) eso debe ser parte de la declaración dinámica:
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;