मुझे यकीन नहीं है कि आप with
. से परेशान क्यों हैं? खंड, सीटीई के बिना यह आसान है; आपको बस यह पहचानने की जरूरत है कि कौन सी तालिका city
. है कॉलम में है:
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;
/
मैंने अनुमान लगाया है कि यह तालिका ए है, अगर यह दूसरा है तो बस उपनाम बदलें। आपको दो तालिकाओं के बीच जुड़ने की स्थिति भी निर्दिष्ट करनी होगी। (यह भी देखा कि मैंने asc
. से पहले एक स्थान जोड़ा है इसे रोकने के लिए क्रम-दर-स्ट्रिंग में संयोजित किया जा रहा है)।
यह त्रुटियों के बिना संकलित करता है; जब मैं दौड़ता हूं तो मुझे ORA-00942 मिलता है:तालिका या दृश्य मौजूद नहीं है जो उचित है। अगर मैं डमी डेटा बनाऊं:
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);
फिर कॉल करने पर यह हो जाता है:
select myfunc('lond', 'city') from dual;
SOME_COL CITY SOME_COL
---------- ------------------------------ ----------
3 East London 3
1 London 1
2 Londonderry 2
यदि आप वास्तव में किसी कारण से सीटीई के साथ रहना चाहते हैं (जैसा कि @बोनिस्ट ने कहा है) कि गतिशील कथन का हिस्सा बनने की आवश्यकता है:
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;