Jag är inte säker på varför du stör dig på with
klausul, det är enklare utan en CTE; du behöver bara identifiera vilken tabell city
kolumnen finns i:
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;
/
Jag har gissat att det är tabell A, byt bara aliaset om det är det andra. Du måste också ange kopplingsvillkoret mellan de två tabellerna. (Märde också att jag lade till ett mellanslag före asc
för att förhindra att det sammanfogas i order-by-strängen).
Detta kompilerar utan fel; när jag körs får jag ORA-00942:tabell eller vy finns inte vilket är rimligt. Om jag skapar dummydata:
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);
sedan anropar den får:
select myfunc('lond', 'city') from dual;
SOME_COL CITY SOME_COL
---------- ------------------------------ ----------
3 East London 3
1 London 1
2 Londonderry 2
Om du verkligen vill hålla fast vid CTE av någon anledning måste det (som @boneist sa) vara en del av det dynamiska uttalandet:
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;