Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara membuat sql dinamis untuk dengan sys_refcursor di Oracle

Saya tidak yakin mengapa Anda repot dengan with klausa, lebih sederhana tanpa CTE; Anda hanya perlu mengidentifikasi tabel mana city kolom ada di:

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

Saya kira itu tabel A, ubah saja aliasnya jika itu yang lain. Anda juga perlu menentukan kondisi gabungan antara dua tabel. (Juga perhatikan saya menambahkan spasi sebelum asc untuk menghentikan itu digabungkan ke dalam urutan demi string).

Ini mengkompilasi tanpa kesalahan; ketika dijalankan saya mendapatkan ORA-00942:tabel atau tampilan tidak ada yang masuk akal. Jika saya membuat data dummy:

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

kemudian memanggilnya mendapat:

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

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

Jika Anda benar-benar ingin tetap menggunakan CTE untuk beberapa alasan, maka (seperti yang dikatakan @boneist) itu perlu menjadi bagian dari pernyataan dinamis:

  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. Pembulatan ke 2 tempat desimal dalam SQL

  2. Cara memperbarui string kosong ke Oracle Clob

  3. Oracle memangkas spasi putih di bagian dalam string

  4. Bagaimana cara memeriksa apakah File adalah Gambar Menggunakan PL/SQL?

  5. Batasan Pemeriksaan Oracle