Saya tidak yakin mengapa Anda repot dengan with
klausa, lebih sederhana tanpa CTE; Anda hanya perlu mengidentifikasi tabel mana city
kolom ada di:
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;
/
Saya kira itu tabel A, ubah saja aliasnya jika itu yang lain. Anda juga perlu menentukan kondisi gabungan antara dua tabel. (Juga perhatikan saya menambahkan spasi sebelum asc
untuk menghentikan itu digabungkan ke dalam urutan demi string).
Ini mengkompilasi tanpa kesalahan; ketika dijalankan saya mendapatkan ORA-00942:tabel atau tampilan tidak ada yang masuk akal. Jika saya membuat data dummy:
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);
kemudian memanggilnya mendapat:
select myfunc('lond', 'city') from dual;
SOME_COL CITY SOME_COL
---------- ------------------------------ ----------
3 East London 3
1 London 1
2 Londonderry 2
Jika Anda benar-benar ingin tetap menggunakan CTE untuk beberapa alasan, maka (seperti yang dikatakan @boneist) itu perlu menjadi bagian dari pernyataan dinamis:
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;