Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да създадете динамичен sql за с sys_refcursor в oracle

Не съм сигурен защо се занимавате с with клауза, по-просто е без CTE; просто трябва да определите коя таблица е 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

Ако наистина искате да се придържате към CTE по някаква причина (както каза @boneist), това трябва да бъде част от динамичното изявление:

  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. Изтриване от две таблици с кръгови външни ключове

  2. Предоставяне на избор на всички таблици, собственост на конкретен потребител

  3. Множество ограничения в таблицата:Как да получите всички нарушения?

  4. Индекси, базирани на функции на Oracle

  5. Какво причинява разликата между процесорното време и изминалото време във файловете на Oracle tkprof