Oracle'da sys_refcursor nasıl ve ne zaman kullanılır?


10

Bazıları bana nasıl ve ne zaman sys_refcursor kullanması gerektiği hakkında küçük bir açıklama verebilir mi?

Yanıtlar:


10

İmleç, bir sorgu için sonuç kümesinin göstergesidir. A döndürerek sys_refcursor, istemcinin sorgudan istediği sayıda veya daha az satırı almasına izin verirsiniz. Durum bilgisi olan uygulamalarda bu, sonuçları sayfalara ayırmak için kullanılabilir.

Bir imleç, bir diziyi döndüren bir PL / SQL işlevi yazmaktan daha fazla esnekliğe izin verebilir; Bununla birlikte, bu ek esnekliğin yararlı olduğu birçok durum bulamadım.

sys_refcursorZayıf bir şekilde yazıldığını belirtmek gerekir , bu nedenle işaretçileri yalnızca yan tümcelerden farklı olan veya değil, aynı zamanda farklı sayı ve sütun türlerine sahip sorgulara döndürebilirsiniz. Alternatif olarak, sonuç kümesindeki sütunların sabitlendiği kuvvetle yazılan imleci kullanabilirsiniz.

Bu, aşağıdaki gibi farklı sorgular döndüren işlevler yazmanıza olanak tanır:

create function get_data ( type varchar2 ) return sys_refcursor as
  ret_cur sys_refcursor;
begin

  if type = 'EMP' then
    open ret_cur for select * from emp;
  elsif type = 'DEPT' then
    open ret_cur for select * from dept;
  end if;

  return ret_cur;
end;

Ancak, sys_refcursoryukarıdaki gibi genel bir "sorgu aç" işlevi oluşturmak için kullanıyorsanız , muhtemelen yanlış bir şey yapıyorsunuz!


@Chris ... örnek işleviniz neden "yanlış?"
Johnny Wu

2
@JohnnyWu bir "bana bir şey olsun" fonksiyonu yönetmek daha zor olacak. Her durumda doğru sonuçları aldığınızdan emin olmak için nasıl test yaparsınız? Güvenlik ne olacak? Bir çerçeve oluşturuyorsanız bu gerekli olabilir. Ancak genel iş mantığı için ayrı get_empsve get_deptsfonksiyonlara sahip olmak daha iyidir
Chris Saxon

1

Olasılıklara örnek olarak: arkada pl / sql olduğu için, bir satırı temsil edecek bir nesne tanımlanabilir, bu nesnelerin pl / sql tablosunu tanımlayabilir,

create type T_MY_TABLE as table of t_my_object;

ve ile biter

OPEN p_recordset FOR select * from table( v_my_table );

Bu nedenle, bir veritabanı tablosunda genellikle yoğun ve / veya şifreli doğrudan sorgular mongo oluşturmak yerine, bir dahili tablo oluşturabilir ve onu doldurmak için pl / sql'in tüm gücüne sahip olabilir. Ve sonuç kümesini toplayan istemci akıllı değildir. Ve iç tablonun tanımını değiştirmek, yönetim tablosundan veritabanı tablosunu değiştirmekten daha kolaydır.

Ayrıca Jasper gibi rapor üreteçleri kullanırken, SQL'i raporun dışına ve veritabanına aktarabilir ve kayıt kümesini almak için prosedürü çağırarak rapor tarafını biçimlendirmeye odaklanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.