sql >> Databasteknik >  >> RDS >> Oracle

Hur man skapar dynamisk sql för med sys_refcursor i oracle

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;



  1. Bästa verktyget för att synkronisera MySQL-databaser

  2. Funktion för att få antal veckodagar mellan två datum exklusive helgdagar

  3. Konstigt intermittent SQL-anslutningsfel, fixar vid omstart, kommer tillbaka efter 3-5 dagar (ASP.NET)

  4. Fel vid import av CSV till postgres med python och psycopg2