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

kumpulan catatan ke sys_refcursor

Dengan asumsi formData . Anda struktur tabel sudah diperbaiki dan diketahui, Anda bisa menggunakan ekspresi kasus untuk menerjemahkan formOption.fName ke nilai kolom yang cocok:

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                                   

Anda kemudian dapat membuat prosedur Anda membuka kursor ref untuk kueri itu, menggunakan nilai argumen untuk nilai ID.

Jika formData struktur tidak diketahui, atau tidak statis, maka Anda mungkin memiliki masalah yang lebih besar; tetapi untuk ini Anda harus kembali ke SQL dinamis. Sebagai titik awal, Anda dapat melakukan sesuatu seperti:

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

Ini menggunakan semua kolom yang sebenarnya didefinisikan dalam tabel untuk membuat ekspresi kasus pada waktu proses; karena kasus fieldName Anda mungkin tidak cocok dengan kamus data, saya memaksa semuanya menjadi huruf kecil untuk perbandingan. Saya juga membatasi kolom string untuk menyederhanakan kasus, tetapi jika Anda memerlukan kolom yang merupakan tipe data lain, maka masing-masing when ... then klausa ekspresi kasus perlu memeriksa tipe data kolom itu (yang dapat Anda tambahkan ke r kursor) dan mengonversi nilai kolom aktual menjadi string dengan tepat. Semua nilai harus berakhir dengan tipe data yang sama, jadi harus berupa string, sungguh.

Bagaimanapun, menguji ini dari 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.

Anda dapat menanyakan fieldOptions untuk mendapatkan kemungkinan nama kolom sebagai gantinya, tetapi Anda mungkin masih memiliki masalah konversi tipe data, yang akan lebih sulit untuk ditangani; tetapi jika semua formData yang direferensikan bidang sebenarnya adalah string maka itu akan menjadi:

  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. Formulir/Aplikasi Oracle di Internet Explorer 8 menggunakan JInitator

  2. ORA-00904 pengidentifikasi tidak valid pada alias dekode

  3. Perlu menghapus Oracle Favicon

  4. Cara mendapatkan daftar semua tampilan terwujud di oracle

  5. Cari nilai dalam nilai kolom yang menyimpan nilai yang dipisahkan koma