sql >> Databáze >  >> RDS >> Oracle

Jak vytvořit dynamický sql pro s sys_refcursor v oracle

Nejsem si jistý, proč se obtěžujete s with klauzule, je to jednodušší bez CTE; stačí určit, která tabulka je city sloupec je v:

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

Uhodl jsem, že je to tabulka A, jen změňte alias, pokud je to ten druhý. Musíte také zadat podmínku spojení mezi dvěma tabulkami. (Také jsem si všiml, že jsem před asc přidal mezeru aby se zastavilo zřetězení do řetězce podle pořadí).

Toto se zkompiluje bez chyb; při spuštění dostanu ORA-00942:tabulka nebo pohled neexistuje, což je rozumné. Pokud vytvořím fiktivní data:

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

pak zavolání dostane:

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

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

Pokud se opravdu chcete z nějakého důvodu držet CTE, pak (jak řekl @boneist), musí to být součástí dynamického prohlášení:

  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. Umístění dočasné tabulky MySQL

  2. SQL - Více hodnot oddělených čárkou při použití GROUP BY

  3. Zavřít automatické připojení db v php?

  4. Připojit MySQL ke stejné tabulce