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

tập hợp các bản ghi để ra sys_refcursor

Giả sử formData của bạn cấu trúc bảng là cố định và đã biết, bạn chỉ có thể sử dụng biểu thức chữ hoa chữ thường để dịch formOption.fName với giá trị cột phù hợp:

select fo.fieldLabel as label,
  case fo.fieldName
    when 'fName' then fd.fName
    when 'lName' then fd.lName
    when 'nName' then fd.mName
  end as value
from formData fd
join fieldOptions fo
on fo.formType = fd.formtype
where fd.id = 3;

LABEL                VALUE               
-------------------- --------------------
First                Frank               
Surname              Peterson            
Middle Initial                           

...
where fd.id = 3;

LABEL                VALUE               
-------------------- --------------------
First Name           Bob                 
Last Name            Smith               
Middle                                   

Sau đó, bạn có thể yêu cầu thủ tục của mình mở con trỏ tham chiếu cho truy vấn đó, sử dụng giá trị đối số cho giá trị ID.

Nếu formData cấu trúc không được xác định, hoặc không tĩnh, thì bạn có thể gặp vấn đề lớn hơn; nhưng đối với điều này, bạn cần phải quay lại SQL động. Khi bắt đầu, bạn có thể làm điều gì đó như:

create procedure p42 (p_id number, p_refcursor out sys_refcursor) as
  l_stmt varchar2(32767);
begin
  l_stmt := 'select fo.fieldLabel as label, case lower(fo.fieldName) ';
  for r in (
    select column_name from user_tab_columns
    where table_name = 'FORMDATA'
    and data_type = 'VARCHAR2'
  )
  loop
    l_stmt := l_stmt || ' when ''' || lower(r.column_name) || ''' then fd.' || r.column_name;
  end loop;
  l_stmt := l_stmt || ' end as value '
    || 'from formData fd '
    || 'join fieldOptions fo '
    || 'on fo.formType = fd.formtype '
    || 'where fd.id = :d1';
  open p_refcursor for l_stmt using p_id;
end p42;
/

Điều này sử dụng tất cả các cột thực sự được xác định trong bảng để tạo biểu thức trường hợp tại thời điểm chạy; vì trường hợp của fieldName của bạn có thể không khớp với từ điển dữ liệu, tôi đang buộc mọi thứ thành chữ thường để so sánh. Tôi cũng giới hạn các cột chuỗi để làm cho trường hợp đơn giản hơn, nhưng nếu bạn cần các cột là các kiểu dữ liệu khác thì mỗi when ... then mệnh đề của biểu thức trường hợp sẽ cần kiểm tra kiểu dữ liệu của cột đó (bạn có thể thêm vào r con trỏ) và chuyển đổi giá trị thực của cột thành chuỗi một cách thích hợp. Tất cả các giá trị phải kết thúc cùng một kiểu dữ liệu, vì vậy nó thực sự phải là chuỗi.

Dù sao, thử nghiệm điều này từ SQL * Plus:

var rc refcursor
exec p42(1, :rc);

PL/SQL procedure successfully completed.

print rc

LABEL                VALUE
-------------------- --------------------
First Name           Bob
Last Name            Smith
Middle

3 rows selected.

Bạn có thể truy vấn fieldOptions để có được các tên cột có thể thay thế, nhưng bạn vẫn có thể gặp sự cố chuyển đổi kiểu dữ liệu, sẽ khó giải quyết hơn; nhưng nếu tất cả formData được tham chiếu các trường thực sự là các chuỗi thì đó sẽ là:

  for r in (
    select fo.fieldName
    from formData fd
    join fieldOptions fo
    on fo.formType = fd.formtype
    where fd.id = p_id
  )
  loop
    l_stmt := l_stmt || ' when ''' || r.fieldName || ''' then fd.' || r.fieldName;
  end loop;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle PL / SQL:Ví dụ về DBMS_SCHEDULER.CREATE_JOB

  2. Nhóm / Đặt hàng Oracle SQL

  3. Ràng buộc DUY NHẤT so với kiểm tra trước khi CHÈN

  4. Nhận tên tháng kể từ ngày trong Oracle

  5. Tên người dùng và mật khẩu mặc định cho cơ sở dữ liệu Oracle