powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Дублирование записей из польз. типа
6 сообщений из 6, страница 1 из 1
Дублирование записей из польз. типа
    #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
Дублирование записей из польз. типа
    #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
Дублирование записей из польз. типа
    #39319371
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

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

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

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

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


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