я таблица типа объекта определяется как этотМожет ли «таблица типа» манипулировать в PL/SQL?
create type user_role_ty as object (
username varchar2(32),
role_nam varchar2(32)
);
create type user_role_nt as table of user_role_ty
/
И выходной переменной в функции
p_user_role_list out bt_ww_user_role_nt
После заполнения
select user_role_ty (username, role_nam)
bulk collect into p_user_role_list
(...)
Как я могу изменить эту переменную типа таблицы? Я хотел бы удалить некоторые строки, например. главный администратор может видеть все, локальный администратор не должен видеть основные админов, пользователь может видеть себя только т.д. Укороченный:
if is_vendor(...) then
NULL;
elsif is_admin(...) then
delete from p_user_role_list
where username in ((...) user_name_list);
else
delete from p_user_role_list
where username <> p_username;
Просто не работает. Существует несколько возможностей: ни один из них не является простым:
- Используйте копию-вставку того же идентичного оригинала, который вы выбираете несколько раз, когда используется небольшое изменение состояния. Работает, но ужасно (плюс риск будущих ошибок).
- Используйте
execute immediate
, который я действительно ненавижу - PL/SQL отлично подходит для интеграции языка сценариев и SQL (например, подсветка синтаксиса).execute immediate
деградирует PL/SQL для вызова SQL по строкам на любом языке (по сравнению с теми, у которых нет многих функций). - Используйте временную таблицу, содержимое которой затем будет скопировано в переменную таблицы. Это лишний ненужный код мусора (код должен быть читаемым и иметь смысл).
Есть ли другой способ?
https://docs.oracle.com/database/121/LNPLS/composites.htm#LNPLS00508 –