07.07.2022 17:47
Harry
 
Доброго дня господа !
Имею механизмы интрефейса ODCIIndex - в частности пакетная встака данных (НЕ ОДНА ЗАПИСЬ !!!)

SQL код:
   static function OdciIndexInsert(ia sys.ODCIIndexInfo,RidList sys.ODCIRidList,NewValList Sys.Odcivarchar2list,env sys.ODCIEnv) Return Number 
 
--static function OdciIndexInsert(ia sys.ODCIIndexInfo,RidList sys.ODCIRidList,NewValList PFP.SV_RccKeyList,env sys.ODCIEnv) Return Number 
  is
  begin 
    
declare 
      
i Integer:=0;
    
begin 
      i
:=To_Number(RegExp_Substr(NewValList(1),'[^|]+',1,2)); 
      
dbms_output.put_line('Insert array='||RidList.Count||' '||I);
    
end;
    return 
ODCIConst.Success;
  
end
Здесь необходимо выяснить
1.как передать объектный-пользовательский тип
(набор полей разных базовых типов - Varchar2, Date, Number)

create or replace type SV_RccKey authid current_user as object
(
Deal Varchar2(4000)
Drep Date,
Keys Number
);


2.как его задекларировать в типе индекса - у меня получаються только базовые типы Sys.Odcivarchar2list,Sys.OdciDateList и т.д.
могут работать в режиме пакетной вставки.

create or replace indextype Sv_RccDelayType for Sv_RccDelayValue(Varchar2) using Sv_RccDelay with array dml(number,Sys.Odcivarchar2list);

Хотел бы так
create or replace indextype Sv_RccDelayType for Sv_RccDelayValue(Varchar2) using Sv_RccDelay with array dml(number,PFP.SV_RccKeyList);

3.Как в момент пакетной вставки словить последную запись (последний пакет) - хочу писать в промежуточный буфер и
делать одну транзакцию на вставку полного пула записей.
Пуль записей это 1-1.5 млн.

begin
i:=To_Number(RegExp_Substr(NewValList(1),'[^|]+',1,2));
dbms_output.put_line('Insert array='||RidList.Count||' '||I);
-- Как здесь узнать что все записи профетчины и эта запись последная
end;


4.Где и чем регулируються промежуточные лимиты массива - у меня это 200 и 55 и так по циклу + все остальные записи
Почему не 200 + 200 + 200 + остальное , откуда и зачем 55
dbms_output.put_line('Insert array='||RidList.Count||' '||I);

Код могу приложить по требованию, но если не затрагивали эту тему вряд-ли этот код будет полезен.

Заранее благодарен !
09.07.2022 14:09
Harry
 
Прилагаю весь код по пункту 1 - запуск вставки в пакетном режиме
Необходимо использовать пользовательский тип Sv_Number
Если тип Number все в порядке - если тип Sv_Number - работает одиночная вставка записей
вопрос - почему ?
SQL код:
drop index     Sv_test_index;
drop indextype Sv_test_index_type;
drop operator  Sv_test_eq;
drop function  Sv_test_eq_fun;
drop type      Sv_index_methods;
drop table     Sv_test_table;
drop type      Sv_NumberList;
drop type      Sv_Number
create or replace type Sv_Number as object
(
  
DEAL Number
);
create or replace NONEDITIONABLE type Sv_NumberList force as Varray(32767of Number;
--
create or replace NONEDITIONABLE type Sv_NumberList force as Varray(32767of Sv_Number;
create or replace type Sv_Index_Methods as object
(
  
Step Number,
  static function 
ODCIGetInterfaces(ifclist OUT SYS.ODCIObjectList) return number,
  static function 
ODCIIndexCreate(ia SYS.ODCIIndexInfoparms VARCHAR2env SYS.ODCIEnv) return number,
  static function 
ODCIIndexDrop(ia SYS.ODCIIndexInfoenv SYS.ODCIEnv) return number,
  static function 
ODCIIndexInsert(ia in sys.ODCIIndexInforid in VARCHAR2,  newval in Numberenv in SYS.ODCIEnv) return number,
--  static function 
ODCIIndexInsert(ia in sys.ODCIIndexInforid in VARCHAR2,  newval in pf_report.Sv_Numberenv in SYS.ODCIEnv) return number,
  static function 
ODCIIndexInsert(ia in sys.ODCIIndexInforidlist in sys.ODCIRidList,  newvallist in pf_report.Sv_NumberListenv in SYS.ODCIEnv) return number

);
/
create or replace type body sv_index_methods is
  
static function ODCIGetInterfaces(ifclist OUT sys.ODCIObjectList) return number
  is
  begin
    ifclist
:=sys.ODCIObjectList(sys.ODCIObject('SYS','ODCIINDEX2'));
    return 
ODCIConst.Success;
  
end;

  static function 
ODCIIndexCreate(ia sys.ODCIIndexInfoparms VARCHAR2,  env sys.ODCIEnv) return number
  is
  begin
    
return ODCIConst.Success;
  
end;

  static function 
ODCIIndexDrop(ia sys.ODCIIndexInfoenv sys.ODCIEnv) return number 
  is
  begin
    
return ODCIConst.Success;
  
end;

  static function 
ODCIIndexInsert(ia sys.ODCIIndexInfo,rid VARCHAR2,newval Number,env sys.ODCIEnv) return number 
--  static function ODCIIndexInsert(ia sys.ODCIIndexInfo,rid VARCHAR2,newval pf_report.sv_Number,env sys.ODCIEnv) return number 
  is
  begin
    dbms_output
.put_line('single');
    return 
ODCIConst.Success;
  
end;

  static function 
ODCIIndexInsert(ia sys.ODCIIndexInfo,ridlist sys.ODCIRidListnewvallist pf_report.Sv_NumberListenv sys.ODCIEnv) return number
  is
  begin
    dbms_output
.put_line('batch');
    return 
ODCIConst.Success;
  
end;
 
end;
/
create or replace function sv_test_eq_fun(a number,b number) return number 
is
begin
  
if a=b then return 1; else return 0end if;
end;
/
create or replace operator sv_test_eq binding(numbernumber) return Number using sv_test_eq_fun;
/
create or replace indextype sv_test_index_type for sv_test_eq(numbernumberusing sv_index_methods 
with 
array dml(Number,pf_report.sv_NumberList)
with local range partition
with system managed storage tables
/
create table sv_test_table (id number);
create index sv_test_index ON sv_test_table(idindextype is sv_test_index_type;
insert into sv_test_table values(1);
insert into sv_test_table
select 2 from dual
 union all
select 3 from dual 
Часовой пояс GMT +3, время: 03:15.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.