sql >> Database >  >> RDS >> Oracle

Dynamische sql maken voor met sys_refcursor in oracle

Ik weet niet zeker waarom je je druk maakt over de with clausule, het is eenvoudiger zonder een CTE; je hoeft alleen maar te identificeren in welke tabel de city kolom staat in:

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;
/

Ik heb geraden dat het tabel A is, verander gewoon de alias als het de andere is. U moet ook de join-voorwaarde tussen de twee tabellen opgeven. (Zie ook dat ik een spatie heb toegevoegd voor asc om te voorkomen dat dat wordt samengevoegd in de volgorde-op-tekenreeks).

Dit compileert zonder fouten; bij het uitvoeren krijg ik ORA-00942:tabel of weergave bestaat niet, wat redelijk is. Als ik dummy-gegevens maak:

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);

dan wordt het gebeld:

select myfunc('lond', 'city') from dual;

  SOME_COL CITY                             SOME_COL
---------- ------------------------------ ----------
         3 East London                             3
         1 London                                  1
         2 Londonderry                             2

Als je om de een of andere reden echt bij de CTE wilt blijven, dan (zoals @boneist zei) moet dat deel uitmaken van de dynamische verklaring:

  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. orakel bit en functie

  2. Upgraden van PostGIS 2.1:Fout:poging om parameter postgis.backend opnieuw te definiëren

  3. Stapsgewijze handleiding voor het installeren van MySQL op Windows

  4. Een object (meer dan 10 eigenschappen) invoegen in mysql via mybatis op basis van annotatie zonder alle eigenschappen op te sommen