Як і коли використовувати sys_refcursor в oracle


Відповіді:


10

Курсор - вказівник на набір результатів для запиту. Повертаючи a, sys_refcursorви дозволяєте клієнту отримувати стільки чи кілька рядків із запиту, як цього потрібно. У програмах, що користуються важливістю, це може використовуватися для перегляду результатів.

Курсор може дозволити більшу гнучкість, ніж написання функції PL / SQL, яка повертає масив, оскільки клієнту повністю залежить, скільки рядків отримати і коли зупинити. Однак, я не знайшов багатьох випадків, коли ця додаткова гнучкість є корисною.

Варто зауважити, що sys_refcursorнабір слабко набраний, тому ви можете повернути покажчики на запити, які мають не лише відмінності від або де пункти, але й різні числа та типи стовпців. Крім того, ви можете використовувати сильно набраний курсор, де стовпці в наборі результатів закріплені.

Це дає змогу писати функції, які повертають різні запити, наприклад:

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;

Однак якщо ви використовуєте sys_refcursorдля створення загальної функції "відкрити запит", як описано вище, ви, ймовірно, робите щось не так!


@Chris ... чому ваша приклад функція "неправильно?"
Джонні Ву

2
@JohnnyWu функцію "дістань мені що-небудь" буде важче керувати. Як ви протестуєте, щоб забезпечити правильні результати у всіх випадках? А як щодо безпеки? Це може знадобитися, якщо ви будуєте рамку. Але для загальної логіки бізнесу краще мати окремі get_empsта get_deptsфункції
Кріс Саксон

1

Як приклад можливостей: оскільки у спині є pl / sql, можна визначити об’єкт для подання рядка, визначити таблицю pl / sql цих об’єктів,

create type T_MY_TABLE as table of t_my_object;

і закінчуються с

OPEN p_recordset FOR select * from table( v_my_table );

Отже, замість того, щоб будувати монго, часто щільні та / або критичні прямі запити на таблиці бази даних, можна створити внутрішню таблицю і мати всю потужність pl / sql для її заселення. А клієнт, що збирає набір результатів, не мудріший. І змінити визначення внутрішньої таблиці простіше від управління pov, ніж зміни таблиці баз даних.

Також при використанні генераторів звітів, таких як Jasper, ви можете виштовхнути SQL зі звіту і в базу даних, а також просто зателефонувати в процедуру, щоб отримати набір записів, залишивши сторону звіту зосередитись на форматуванні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.