07.07.2022 17:47
Доброго дня господа !
Имею механизмы интрефейса 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
Прилагаю весь код по пункту 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(32767) of Number;
--create or replace NONEDITIONABLE type Sv_NumberList force as Varray(32767) of 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.ODCIIndexInfo, parms VARCHAR2, env SYS.ODCIEnv) return number,
  static function ODCIIndexDrop(ia SYS.ODCIIndexInfo, env SYS.ODCIEnv) return number,
  static function ODCIIndexInsert(ia in sys.ODCIIndexInfo, rid in VARCHAR2,  newval in Number, env in SYS.ODCIEnv) return number,
--  static function ODCIIndexInsert(ia in sys.ODCIIndexInfo, rid in VARCHAR2,  newval in pf_report.Sv_Number, env in SYS.ODCIEnv) return number,
  static function ODCIIndexInsert(ia in sys.ODCIIndexInfo, ridlist in sys.ODCIRidList,  newvallist in pf_report.Sv_NumberList, env 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.ODCIIndexInfo, parms VARCHAR2,  env sys.ODCIEnv) return number
  is
  begin
    return ODCIConst.Success;
  end;

  static function ODCIIndexDrop(ia sys.ODCIIndexInfo, env 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.ODCIRidList, newvallist pf_report.Sv_NumberList, env 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 0; end if;
end;
/
create or replace operator sv_test_eq binding(number, number) return Number using sv_test_eq_fun;
/
create or replace indextype sv_test_index_type for sv_test_eq(number, number) using 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(id) indextype 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, время: 02:45.

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