powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / объектные типы или packages
11 сообщений из 11, страница 1 из 1
объектные типы или packages
    #40089426
rtyts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добра!
Версия:
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Только начинаю разбираться с ORACLE.
Подскажите, в каком случае (кроме именно типов/структур данных) используются объектные типы в oracle? Ведь есть же packages там внутри можно процедуры/функции создавать. Не могу понять, зачем создавать типы с кодом внутри, с if-ами и т.д. То, что это подобие ОО подхода я понимаю. И предок есть и наследник. Я вот хочу понять, какой должна быть задача, чтобы разработчик решил - " Ага, тут без объектного типа не обойтись..."
Сразу скажу - гуглил. Примеры смотрел, но ясности "зачем" они нужны пока нет.
...
Рейтинг: 0 / 0
объектные типы или packages
    #40089675
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rtyts

Подскажите, в каком случае (кроме именно типов/структур данных) используются объектные типы в oracle?
...
Примеры смотрел, но ясности "зачем" они нужны пока нет.

И ни у кого нет.

Работайте без них.
Если станет очень, очень, очень их не хватать, разберетесь как, что и, главное, зачем.
...
Рейтинг: 0 / 0
объектные типы или packages
    #40090007
Фотография Хороший человек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rtyts, используем Object type, когда некий код используется в нескольких отчетах, которые имеют различные условия выбора. Удобно сопровождать, меняешь только запрос в функции.

Создаем Object type и table type пишем функцию заполнения Object type и обращаемся, примерно таким образом:
select * from table(f_func(par1, par2)).

ф-я может имеет вид типа

function f_func(par1 number,par2) return t_object_type_table pipelined is

cur_ sys_refcursor;

begin
open cur_ for 'select t_object_type(v1,v2,v3) from t1 where v1='||par1||' and '||par2||';'

LOOP
FETCH cur_ into c;
EXIT WHEN cur_%NOTFOUND;
pipe row (C) ;

END LOOP;
CLOSE cur_;
return;
end;
...
Рейтинг: 0 / 0
объектные типы или packages
    #40090022
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хороший человек
rtyts, используем Object type, когда некий код используется в нескольких отчетах, которые имеют различные условия выбора. Удобно сопровождать, меняешь только запрос в функции.

Создаем Object type и table type пишем функцию заполнения Object type и обращаемся, примерно таким образом:
select * from table(f_func(par1, par2)).

ф-я может имеет вид типа

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function f_func(par1 number,par2) return t_object_type_table  pipelined is

   cur_ sys_refcursor;

begin
  open cur_ for 'select t_object_type(v1,v2,v3)  from t1 where v1='||par1||' and '||par2||';' 
 
LOOP
    FETCH cur_ into c;
    EXIT WHEN cur_%NOTFOUND;
  pipe row (C) ;

   END LOOP;
  CLOSE cur_;
   return;
end;


Для оформления кода используйте, пожалуйста, тэг SRC.
...
Рейтинг: 0 / 0
объектные типы или packages
    #40090046
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хороший человек
ф-я может имеет вид типа


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function f_func(par1 number, par2 date) return f_func_tab pipelined is
   -- Курсор может быть описан отдельно, в т.ч. в спеке этого же или другого пакета-библиотеки
   -- При отдельном описании удобно задать имя курсора как производную от имени функции
   -- дополнительный бонус: описание объектных типов может быть выполнено в спеке пакета как
   -- type f_func_tab is table of f_func_c%rowtype;
   -- что упрощает сопровождение подобного кода
   -- warning: в 19с нужен патч, иначе сгенерированный объектный тип будет содержать атрибуты ATTR_1, ATTR_2... вместо имен атрибутов из запроса

   cursor f_func_c(p_par1 number, p_par2 date) is 
     select v1,v2,v3  from t1 
    where -- используйте bind variables вместо конкатенации
        v1 = p_par1 and x2 = p_par2;
begin
  -- курсорный цикл может выглядеть заметно проще
  for i in f_func_c(par1, par2) 
    LOOP
      pipe row (i) ;
   END LOOP;
   return;
end;
...
Рейтинг: 0 / 0
объектные типы или packages
    #40090053
Фотография Хороший человек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Код: sql
1.
'select t_object_type(v1,v2,v3)  from t1 where v1='||par1||' and '||par2||';' 



- использовать bind variables вместо конкатенации не подойдет, если par2 будет например иметь значения ' v1 = 10'.
...
Рейтинг: 0 / 0
объектные типы или packages
    #40090059
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А это уже SQL injection. От которой бинды как раз и защищают.
...
Рейтинг: 0 / 0
объектные типы или packages
    #40090214
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хороший человек
если par2 будет например иметь значения ' v1 = 10'.

А если par2 будет иметь значение ' 1=0 union all select object_type(secret1,secret2,secret3) from secret_data' то что Вы скажете потом безопасникам?
...
Рейтинг: 0 / 0
объектные типы или packages
    #40094042
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я в одном проекте такое на объектах намутил:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      v_ind_data.calc_info := v_ind_data.calc_info
                                        .add_step_info('Расчёт баллов ДТП по годам').cr()
                                        .append_item('Баллы за 2 года:').tab()
                                        .append_item(n2c(v_ind_data.rating_coef.claim_points_2years)).cr()
                                        .append_item('Баллы за 4 года:').tab()
                                        .append_item(n2c(v_ind_data.rating_coef.claim_points_4years)).cr()
                                        .append_item('Баллы за 6 лет:').tab()
                                        .append_item(n2c(v_ind_data.rating_coef.claim_points_6years)).cr()
                                        .append_item('Кол-во убытков:').tab()
                                        .append_item(v_ind_data.rating_coef.claims_qty).cr()
                                 ;      



Это формирование текста, где каждый метод add_step_info(), append_item(), tab(), cr() добавляет в текст соответствующую строку и возвращает новый объект. Не очень эффективно, но выглядит прикольно.

В другом проекте - загружаю данные из EXCEL, формируя объект, а в конструкторе сразу вычисляю по текстовым полям значения из справочников.
...
Рейтинг: 0 / 0
объектные типы или packages
    #40094164
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah
Я в одном проекте такое на объектах намутил:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      v_ind_data.calc_info := v_ind_data.calc_info
                                        .add_step_info('Расчёт баллов ДТП по годам').cr()
                                        .append_item('Баллы за 2 года:').tab()
                                        .append_item(n2c(v_ind_data.rating_coef.claim_points_2years)).cr()
                                        .append_item('Баллы за 4 года:').tab()
                                        .append_item(n2c(v_ind_data.rating_coef.claim_points_4years)).cr()
                                        .append_item('Баллы за 6 лет:').tab()
                                        .append_item(n2c(v_ind_data.rating_coef.claim_points_6years)).cr()
                                        .append_item('Кол-во убытков:').tab()
                                        .append_item(v_ind_data.rating_coef.claims_qty).cr()
                                 ;      



Это формирование текста, где каждый метод add_step_info(), append_item(), tab(), cr() добавляет в текст соответствующую строку и возвращает новый объект. Не очень эффективно, но выглядит прикольно.

В другом проекте - загружаю данные из EXCEL, формируя объект, а в конструкторе сразу вычисляю по текстовым полям значения из справочников.

Как насчет сопровождения такого кода другими разработчиками и тестерами?
Тоже "Не очень эффективно, но выглядит прикольно?" :-)
...
Рейтинг: 0 / 0
объектные типы или packages
    #40094272
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Азм есть один во всех ипостасях.

Что тут сопровождать?
Клиентский код гораздо лучше чем
Код: plsql
1.
 f1 || chr(9) || f2 || chr(10)

.
А в объект можно один раз слазить, посмотреть, как реализовано, забыть и пользоваться.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / объектные типы или packages
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]