sql >> Database teknologi >  >> RDS >> Oracle

Sådan opretter du dynamisk sql til med sys_refcursor i oracle

Jeg er ikke sikker på, hvorfor du generer with klausul, det er enklere uden en CTE; du skal blot identificere, hvilken tabel city er kolonne er 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;
/

Jeg har gættet på, at det er tabel A, skift blot aliaset, hvis det er det andet. Du skal også angive sammenføjningsbetingelsen mellem de to tabeller. (Også bemærket, at jeg tilføjede et mellemrum før asc for at forhindre, at det bliver sammenkædet i rækkefølgen).

Dette kompilerer uden fejl; når jeg kører, får jeg ORA-00942:tabel eller visning findes ikke, hvilket er rimeligt. Hvis jeg opretter dummy-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);

derefter kaldes det:

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

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

Hvis du virkelig vil holde fast i CTE af en eller anden grund, så (som @boneist sagde) skal det være en del af den dynamiske erklæring:

  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. Introduktion til SQL Server

  2. Er sp_-præfikset stadig et nej-nej?

  3. Hvordan kører jeg en SQL-fil i PostgreSQL ved hjælp af en Linux-terminal?

  4. Konverter månedsnavn til månedsnummer i PostgreSQL