Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Дублирование записей из польз. типа / 6 сообщений из 6, страница 1 из 1
02.10.2016, 23:57:31
    #39319316
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование записей из польз. типа
Доброго дня господа !

Можно ли из пользовательского типа обеспечить дублирование записей

Код: plsql
1.
2.
3.
4.
5.
6.
 select A.*,
          MyType(A.F2).OKK 
  from (select 1 F1,2 F2 from DUAL
            union all
           select 2 F1,3 F2 from DUAL
          ) A



MyType(A.F2).OKK
Ссылаюсь на пользовательский тип c передачей в конструктор типа кол-ва записей
для дублирования (поле F2)
OKK - что-то возвращает по пользов. методике + тип дублирует запись из таблицы A


Результат
F1 F2 OKK
1 2 10
1 2 20
2 3 100
2 3 200
2 3 300

Заранее благодарен !
...
Рейтинг: 0 / 0
03.10.2016, 00:52:09
    #39319326
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование записей из польз. типа
Можно на табличной/конвейерной функции.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
create or replace type MyType as object( i_n number
, member function okk return sys.odcinumberlist pipelined
);
/
 
Type created

create or replace type body MyType as
member function okk return sys.odcinumberlist pipelined is
  begin
    for i in 1..i_n loop
      pipe row (i*power(10,i_n-1));
    end loop;
    return;
  end;
end;
/
 
Type body created

with A as (select 1 F1,2 F2 from DUAL
            union all
           select 2 F1,3 F2 from DUAL)
select *
from A, table((MyType(A.F2)).okk()) t;
 
        F1         F2 COLUMN_VALUE
---------- ---------- ------------
         1          2           10
         1          2           20
         2          3          100
         2          3          200
         2          3          300
 
SQL> 
...
Рейтинг: 0 / 0
03.10.2016, 08:17:47
    #39319371
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование записей из польз. типа
andrey_anonymous,

Принято-спасибо, а в 12 версии она стабильно работает ?
в 10-ке были зависания на больших объемах
...
Рейтинг: 0 / 0
03.10.2016, 10:57:54
    #39319477
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование записей из польз. типа
HOME_XПринято-спасибо, а в 12 версии она стабильно работает ?
в 10-ке были зависания на больших объемах
??? Не знаю ничего про "зависания" pipelined в 10 и 11.
Объемов больших, правда, не гонял - не более 5 миллионов строк.

12 - работаю сейчас.
Знаю, что более 70 миллионов записей с inter-row dependencies в одну транзакцию система, над которой сейчас работаем, не прожует - свалится в темп на буферизации и вылетит по недостатку последнего.
А 30-50 миллионов - прожует, хоть и не за час.
Оптимально - до 15 миллионов, буфер остается в памяти.
Но "зависаний" не наблюдал.

Не знаю Ваших условий - вероятно, этих объемов недостаточно для проявления проблемы.
...
Рейтинг: 0 / 0
03.10.2016, 17:54:22
    #39319843
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование записей из польз. типа
andrey_anonymous,

Нормально - спасибо
...
Рейтинг: 0 / 0
06.10.2016, 16:44:52
    #39322131
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование записей из польз. типа
andrey_anonymous,


Скажите а нет ли возможности внести момент дублирования в конструктор
(думаю что нет, просто задаю вопрос)

Т.е. хотел исключить метод Show = table(ttNbi1(A.F1,A.F2,A.F3). Show(1) )
Попроще для пользовательского вызова.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
create or replace type rcNbi1 as object(id_sap varchar2(20),
                                        total  number(18,2),
                                        duble  number(18,2),
                                        down   number(18,2),
                                        span   number(18,2)
                                       );
/
create or replace type tbNbi1 as table of rcNbi1;
/
create or replace type ttNbi1 as object
(
  main    rcNbi1,
  list    VARCHAR2(4000),
  
  constructor function ttNbi1(
                              id_sap VARCHAR2,
                              total  NUMBER,
                              duble  NUMBER
                             ) 
                             return self as result,

   static function Calculate (
                              id_sap in out VARCHAR2,
                              total  in out NUMBER,
                              duble  in out NUMBER,
                              down   in out NUMBER,
                              list   in out VARCHAR2
                             ) 
                             return varchar2,

   member function Show      (
                              key in NUMBER
                             ) 
                             return tbNbi1 pipelined
);


create or replace type body ttNbi1 as

  constructor function ttNbi1(id_sap  VARCHAR2,
                              total   NUMBER,
                              duble   NUMBER
                             ) return self as result
  as 
  begin
    declare
      s varchar2(2);
    begin
      self.main:=rcNbi1(id_sap,total,duble,0,0);
      s:=ttNbi1.Calculate(self.main.id_sap,self.main.total,self.main.duble,self.main.down,self.list);
      return;
    end;
  end;
  
  static function Calculate(id_sap in out VARCHAR2,
                            total  in out NUMBER,
                            duble  in out NUMBER,
                            down   in out NUMBER,
                            list   in out VARCHAR2
                           ) return varchar2
  as 
  begin 
    down:=total*2;
    for i in 1..duble loop
      if list is Null then list:=i; else list:=list||';'||i; end if;
    end loop;
    return 'OK';
  end;
  
  member function Show     (
                            key in NUMBER
                           ) return tbNbi1 pipelined
  as 
  begin
    declare 
      a numeric(18,2):=0;
      s numeric(18,2):=0;
    begin 
      for i in 1..self.main.duble loop
        a:=To_Number(RegExp_Substr(self.list,'[^;]+',1,i));
        if key=0 then s:=s+a; a:=s; end if;
        if key=0 and i=self.main.duble or key=1 then pipe row(rcNbi1(self.main.id_sap,self.main.total,self.main.duble,self.main.down,a)); end if;
      end loop;
    end;   
  end;

end;
/

select T.*
  from (select '123456789' F1,120.00 F2,12   F3 from DUAL        
         union all  
        select '910003444' F1,500.00 F2,10   F3 from DUAL        
       ) A,
       table(ttNbi1(A.F1,A.F2,A.F3).Show(1)) t



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


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