Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách tạo sql động cho bằng sys_refcursor trong oracle

Tôi không rõ tại sao bạn lại làm phiền with mệnh đề này đơn giản hơn khi không có CTE; bạn chỉ cần xác định bảng nào là city cột nằm trong:

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

Tôi đã đoán đó là bảng A, chỉ cần thay đổi bí danh nếu là bảng khác. Bạn cũng cần chỉ định điều kiện nối giữa hai bảng. (Cũng nhận thấy rằng tôi đã thêm một khoảng trắng trước asc để ngăn chặn việc được nối vào chuỗi theo thứ tự).

Biên dịch này không có lỗi; khi chạy tôi nhận được ORA-00942:bảng hoặc chế độ xem không tồn tại, điều đó là hợp lý. Nếu tôi tạo dữ liệu giả:

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

sau đó gọi nó sẽ nhận được:

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

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

Nếu bạn thực sự muốn gắn bó với CTE vì một lý do nào đó thì (như @boneist đã nói) cần phải là một phần của câu lệnh động:

  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 Hàm lấy Ngày, Tháng và Năm từ một Ngày trong Oracle

  2. Cách viết truy vấn SQL nối nhiều hàng từ bảng đầu vào thành một hàng trong bảng đầu ra

  3. Ai đó có thể giải thích câu lệnh MERGE thực sự làm gì trong Oracle không?

  4. tìm kiếm văn bản oracle blob

  5. Làm cách nào để cài đặt Oracle Instant Client trên máy Mac?