Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / OdciIndex - Array вставка объектного типа / 10 сообщений из 10, страница 1 из 1
06.02.2022, 12:46
    #40132010
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OdciIndex - Array вставка объектного типа
Доброго дня господа !

Имею использование интерфейса OdciIndex
Хотелось бы использовать пакетную вставку данных

Static Function OdciIndexInsert (iA Sys.OdciIndexInfo, RidList Sys.OdciRidList, NewValList Sv_OdciVarchar2List , Env Sys.OdciEnv) Return Number
Результат консоли прилагаю
--------------------------
Drop
Create
Insert row
Insert array= 200
Insert array= 55
Insert array= Last record 45
Execute
--------------------------
Возникли вопросы - великие гуру подскажите если сталкивались
1.Чем и где регулируеться размер промежуточных массивов = 200 и 55
2.Как определить последную запись или последний массив (=45 записей)
3.Хотел бы использовать объектный тип Sv_Varchar2 в качестве выражения
индекса, база не находит сигнатуры функции и переходит в режим вставки
одной записи. Где ошибка ?
Для реализации пункта 3 - необходимо ПЕРЕремить 5-ть строк в коде

Заранее благодарен !

Код: 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.
96.
drop index     Sv_Test_Index;
drop table     Sv_Test_Table;
drop indextype Sv_Test_IndType;
drop operator  Sv_Test_Oper;
drop function  Sv_Test_Exe;
drop type      Sv_Test_Method;
drop type      Sv_OdciVarchar2List;
drop type      Sv_Varchar2;

create or replace type Sv_Varchar2 authid current_user as object
(
  Keys Varchar2(4000)
);

create or replace type Sv_OdciVarchar2List as Varray(32767) of Varchar2(4000);
--create or replace type Sv_OdciVarchar2List as Varray(32767) of Sv_Varchar2;

create or replace type Sv_Test_Method as object
(
  Step Number,
  Static Function OdciIndexInsert  (iA Sys.OdciIndexInfo, Rid Varchar2, NewVal Varchar2,                           Env Sys.OdciEnv) Return Number,
  --Static function OdciIndexInsert  (iA Sys.OdciIndexInfo, Rid Varchar2, NewVal Sv_Varchar2,                        Env Sys.OdciEnv) Return Number,
  Static Function OdciIndexInsert  (iA Sys.OdciIndexInfo, RidList Sys.OdciRidList, NewValList Sv_OdciVarchar2List, Env Sys.OdciEnv) Return Number,
  Static Function OdciGetInterfaces(ifClist out Sys.OdciObjectList                                                                 ) Return Number,
  Static Function OdciIndexCreate  (iA Sys.OdciIndexInfo, Parms Varchar2,                                          Env Sys.OdciEnv) Return Number,
  Static Function OdciIndexDrop    (iA Sys.OdciIndexInfo,                                                          Env Sys.OdciEnv) Return Number
);
/
create or replace type body Sv_Test_Method
is
  Static Function OdciIndexInsert  (iA Sys.OdciIndexInfo, Rid Varchar2, NewVal Varchar2,                         Env Sys.OdciEnv) Return Number
  --Static function OdciIndexInsert  (iA Sys.OdciIndexInfo, Rid Varchar2, NewVal Sv_Varchar2,                      Env Sys.OdciEnv) Return Number
  is 
  begin
    dbms_output.put_line('Insert row');
    Return OdciConst.Success;
  end;
                                                                                              
  Static Function OdciIndexInsert  (iA Sys.OdciIndexInfo, RidList Sys.OdciRidList, NewValList Sv_OdciVarchar2List, Env Sys.OdciEnv) Return Number
  is
     S Varchar2(50):='';
  begin 
    if(RidList.Count<>200 and RidList.Count<>55)then S:='Last record'; end if;
    dbms_output.put_line('Insert array= '||S||' '||RidList.Count);
    return OdciConst.Success;
  end;

  Static Function OdciGetInterfaces(ifClist out Sys.OdciObjectList                                                              ) Return Number
  is
  begin
    ifClist:=Sys.OdciObjectList(Sys.OdciObject('SYS','ODCIINDEX2'));
    dbms_output.put_line('Get');
    Return OdciConst.Success;
  end;

  Static Function OdciIndexCreate  (iA Sys.OdciIndexInfo, Parms Varchar2,                                        Env Sys.OdciEnv) Return Number
  is
  begin
    dbms_output.put_line('Create');
    Return OdciConst.Success;
  end;

  Static Function OdciIndexDrop    (iA Sys.OdciIndexInfo,                                                        Env Sys.OdciEnv) Return Number
  is
  begin
    dbms_output.put_line('Drop');
    Return OdciConst.Success;
  end;

end;
/
create or replace function Sv_Test_Exe(A Number,B Number) Return Number 
is
begin
  dbms_output.put_line('Execute');
  if a=b then return 1; else return 0; end if;
end;
/
create or replace operator Sv_Test_Oper binding(Number,Number) Return Number using Sv_Test_Exe;

/

create indextype Sv_Test_IndType for Sv_Test_Oper(Number,Number) using Sv_Test_Method with array DML(Varchar2,Sv_OdciVarchar2List);
--create indextype Sv_Test_IndType for Sv_Test_Oper(Number,Number) using Sv_Test_Method with array DML(Sv_Varchar2,Sv_OdciVarchar2List);

create table     Sv_Test_Table(ID Number(18,2),NM Varchar2(10));

create index     Sv_Test_Index on Sv_Test_Table(NM) indextype is Sv_Test_IndType;
--create index     Sv_Test_Index on Sv_Test_Table(Sv_Varchar2(NM)) indextype is Sv_Test_IndType;

insert into Sv_Test_Table values(0,'One');
insert into Sv_Test_Table select A.* from (select Level F1,'Array' F2 from DUAL connect by Level<301) A;
commit;
select * 
  from Sv_Test_Table
 where Sv_Test_Oper(1,1)=1;
...
Рейтинг: 0 / 0
08.02.2022, 10:43
    #40132436
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OdciIndex - Array вставка объектного типа
Доброго дня господа

Так понял - вопрос некорректно поставлен ?
Или механизм интерфейса несколько недоделан ?

Спасибо
...
Рейтинг: 0 / 0
10.02.2022, 12:53
    #40133108
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OdciIndex - Array вставка объектного типа
HOME_X
1.Чем и где регулируеться размер промежуточных массивов = 200 и 55
Я не знаю.
в 11g вроде как билось 200 + 53, в современных версиях 200+55, что вообще выводит на магическую цифру 256.
Но в деталях расскажут только злые спецы по internals, и то если раскопали.
HOME_X
2.Как определить последную запись или последний массив (=45 записей)
Это некорректно сформулированный вопрос, кмк.
С точки зрения структуры индекса результат пакетной вставки ничем не должен отличаться от вставки того же набора записей по одной.
Как следствие, подобный метод не требуется.
HOME_X
3.Хотел бы использовать объектный тип Sv_Varchar2 в качестве выражения
индекса, база не находит сигнатуры функции и переходит в режим вставки
одной записи. Где ошибка ?

Нет ошибки, Ваш код скомпилировался и отработал.
...
Рейтинг: 0 / 0
10.02.2022, 12:53
    #40133109
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OdciIndex - Array вставка объектного типа
.
...
Рейтинг: 0 / 0
10.02.2022, 15:01
    #40133191
SeaGate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OdciIndex - Array вставка объектного типа
HOME_X1.Чем и где регулируеться размер промежуточных массивов = 200 и 55
200 это _domain_index_dml_batch_size
Тот же код с _domain_index_dml_batch_size = 50 показывает след вывод:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> insert into Sv_Test_Table
  2  select A.* from (select Level F1,'Array' F2 from DUAL connect by Level<301) A;
Insert array= Last record 50
Insert array= Last record 50
Insert array= Last record 50
Insert array= Last record 50
Insert array= Last record 50
Insert array= Last record 5
Insert array= Last record 45

300 rows created.


255 это ограничение на размер массива DML операций (в данном случае, вставки, QMI, redo opcode 11.11).
Отключить пакетную вставку можно через _kdt_buffering=false.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> insert /*+ opt_param('_kdt_buffering' 'false')*/into Sv_Test_Table
  2  select A.* from (select Level F1,'Array' F2 from DUAL connect by Level<11) A;
Insert row
Insert row
Insert row
Insert row
Insert row
Insert row
Insert row
Insert row
Insert row
Insert row

10 rows created.
...
Рейтинг: 0 / 0
10.02.2022, 15:35
    #40133218
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OdciIndex - Array вставка объектного типа
SeaGate

200 это _domain_index_dml_batch_size
...
255 это ограничение на размер массива DML операций (в данном случае, вставки, QMI, redo opcode 11.11).
Отключить пакетную вставку можно через _kdt_buffering=false.

Спасибо, записал в склерозник.
...
Рейтинг: 0 / 0
15.02.2022, 23:29
    #40134403
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OdciIndex - Array вставка объектного типа
andrey_anonymous

Нет ошибки, Ваш код скомпилировался и отработал.


Доброго дня господа !

Вы хотите сказать что мой код с пользовательским типом
Sv_Varchar2 работает в пакетном режиме (у меня в режиме одиночной вставки) ?
Уточните Вашу версию - моя 19С

Спасибо

P.S. - может там что-то донастроить надо ?
...
Рейтинг: 0 / 0
15.02.2022, 23:49
    #40134406
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OdciIndex - Array вставка объектного типа
SeaGate

_domain_index_dml_batch_size = 50

Принято - спасибо !

SeaGate

Отключить пакетную вставку можно через _kdt_buffering=false.

Принято - спасибо !

SeaGate

255 это ограничение на размер массива DML операций (в данном случае, вставки, QMI, redo opcode 11.11).

Здесь вопрос - это системное ограничение - оно НЕУПРАВЛЯЕМОЕ ?
Т.е. _domain_index_dml_batch_size <=255 - верно понял ?
Больше нельзя ?

SeaGate

SQL> insert /*+ opt_param('_kdt_buffering' 'false')*/into Sv_Test_Table

Принято - спасибо !


Это некорректно сформулированный вопрос, кмк.
С точки зрения структуры индекса результат пакетной вставки ничем не должен отличаться от вставки
того же набора записей по одной.
Как следствие, подобный метод не требуется.

ГЛАВНЫЙ ВОПРОС !!!!
Я хотел реализовать вставку записей индекса одной транзакцией
Т.е. событие по вставке одной записи или событие по пакетной вставке - пишут указатели во
временной массив - и как только процесс заканчивается. Делаю перенос в базовую таблицу
В обоих вариантах нужен ФЛАГ что запись последная и начат транзакцию переноса
Как реализовать этот момент ?
У меня достаточнаая большая таблица и постоянные execute immediate - будут тормозить загрузку
...
Рейтинг: 0 / 0
16.02.2022, 00:26
    #40134411
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OdciIndex - Array вставка объектного типа
HOME_X
andrey_anonymous

Нет ошибки, Ваш код скомпилировался и отработал.


Доброго дня господа !

Вы хотите сказать что мой код с пользовательским типом
Sv_Varchar2 работает в пакетном режиме (у меня в режиме одиночной вставки) ?
Уточните Вашу версию - моя 19С


Спасибо

P.S. - может там что-то донастроить надо ?


P.S. Вы когда запускали ПЕРЕремили 5-ть строк ???
Это было спец. ремарка для другого варианта ?
...
Рейтинг: 0 / 0
21.02.2022, 23:40
    #40135755
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OdciIndex - Array вставка объектного типа
HOME_X,

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


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