Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ओरेकल में sys_refcursor के साथ गतिशील एसक्यूएल कैसे बनाएं

मुझे यकीन नहीं है कि आप 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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqlplus का उपयोग करके Oracle DB से कनेक्ट करें

  2. जांचें कि कोई फ़ाइल मौजूद है या नहीं?

  3. ऑटो इंक्रीमेंट कॉलम - Oracle में डिफ़ॉल्ट मान के रूप में अनुक्रम

  4. java.sql.SQLException:ORA-00932:असंगत डेटाटाइप:अपेक्षित NUMBER को BINARY मिला

  5. पुनःपूर्ति सूत्र ओरेकल एसक्यूएल क्वेरी