Nejsem si jistý, proč se obtěžujete s with
klauzule, je to jednodušší bez CTE; stačí určit, která tabulka je city
sloupec je v:
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;
/
Uhodl jsem, že je to tabulka A, jen změňte alias, pokud je to ten druhý. Musíte také zadat podmínku spojení mezi dvěma tabulkami. (Také jsem si všiml, že jsem před asc
přidal mezeru aby se zastavilo zřetězení do řetězce podle pořadí).
Toto se zkompiluje bez chyb; při spuštění dostanu ORA-00942:tabulka nebo pohled neexistuje, což je rozumné. Pokud vytvořím fiktivní data:
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);
pak zavolání dostane:
select myfunc('lond', 'city') from dual;
SOME_COL CITY SOME_COL
---------- ------------------------------ ----------
3 East London 3
1 London 1
2 Londonderry 2
Pokud se opravdu chcete z nějakého důvodu držet CTE, pak (jak řekl @boneist), musí to být součástí dynamického prohlášení:
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;