Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Регламент или Extensible Indexing / 20 сообщений из 20, страница 1 из 1
15.12.2021, 14:33
    #40120237
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
STATIC FUNCTION ODCIINDEXINSERT(ia SYS.ODCIINDEXINFO, rid ROWID,
                          newval NUMBER, env SYS.ODCIEnv) RETURN NUMBER IS
   stmt VARCHAR2(2000);
  BEGIN
/* Construct the SQL statement */
   stmt := 'INSERT INTO ' || ia.INDEXSCHEMA || '.' || ia.INDEXNAME || 
          '_STORAGE_TAB  VALUES (:a, :b)';
/* Execute the SQL statement */
   EXECUTE IMMEDIATE stmt using newval, rid;
   RETURN ODCICONST.SUCCESS;
  END;
...
Рейтинг: 0 / 0
16.12.2021, 08:00
    #40120476
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
А кто заставляет использовать execute immediate?
Юзай dbms_sql.
Сделай ассоциативный массив с ключем ia.INDEXSCHEMA || '.' || ia.INDEXNAME и содержащий номер открытого и распарсенного курсора (с использованием placeholder-ов) и тебе останется только прибиндить нужные значения и выполнить его.
...
Рейтинг: 0 / 0
16.12.2021, 19:21
    #40120777
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
Вячеслав Любомудров,

Аналогично MEMBER FUNCTION ODCIINDEXFETCH - принято !
А насколько это применимо к таким объемам (700 млн.)
Вы пробывали - негатив есть ?
...
Рейтинг: 0 / 0
16.12.2021, 23:13
    #40120844
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
Не понял, как мой ответ переехал в вопрос? А мой пост удалился?
...
Рейтинг: 0 / 0
17.12.2021, 13:21
    #40121009
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
Sayan Malakshinov
Не понял, как мой ответ переехал в вопрос? А мой пост удалился?


У меня удален почти весь первичный вопрос
Если не затруднит повторите плис Ваши сомнения- комментарии
...
Рейтинг: 0 / 0
17.12.2021, 13:28
    #40121012
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
Общий комментарий: динамический SQL в имплементации ODCIIndex нужен лишь в случае, когда делаете инструмент (универсальное решение, предполагающее повторное использование без какой-либо правки).
Если же делаете решение локальное, не предполагающее тиражирования - то динамика нужна только для DDL (ODCIIndexCreate и иже с ним).
...
Рейтинг: 0 / 0
26.12.2021, 13:13
    #40123125
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
Доброго дня господа !

Усложнил процесс - выбираю физ записи удовлетворяющие условию и храню ТОЛЬКО их в индексе ' where KEY1+KEY2+KEYn>0' ;

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
STATIC FUNCTION ODCIINDEXCREATE (ia SYS.ODCIINDEXINFO, parms VARCHAR2, env SYS.ODCIEnv) RETURN
 NUMBER
  IS
   stmt   VARCHAR2(2000);
  BEGIN
/* Construct the SQL statement */
   stmt := 'Create Table ' || ia.INDEXSCHEMA || '.' || ia.INDEXNAME ||
           '_STORAGE_TAB' || '(col_val, base_rowid, constraint pk PRIMARY KEY ' ||
           '(col_val, base_rowid)) ORGANIZATION INDEX AS SELECT ' ||
           ia.INDEXCOLS(1).COLNAME || ', ROWID FROM ' || 
           ia.INDEXCOLS(1).TABLESCHEMA || '.' || ia.INDEXCOLS(1).TABLENAME||

           ' where KEY1+KEY2+KEYn>0' ;

   EXECUTE IMMEDIATE stmt;
   RETURN ODCICONST.SUCCESS;
  END;



Аналогичным путем необходимо изменить процедуру на вставку одной записи
Как правильно достучаться до необходимых полей таблицы
Синтетически выглядит так - фактическое выполнение невозможно

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 STATIC FUNCTION ODCIINDEXINSERT(ia SYS.ODCIINDEXINFO, rid ROWID,newval NUMBER, env SYS.ODCIEnv) RETURN NUMBER IS
   stmt VARCHAR2(2000);

   s1    VARCHAR2(2000);
   key   Number; 
  BEGIN
   s1:='select KEY1+KEY2+KEYn from PPP.MAIN_TABLE where RowID=''' || rid ||'''';   
   EXECUTE IMMEDIATE s1 into key;

   if key>0 then 
      stmt := 'INSERT INTO ' || ia.INDEXSCHEMA || '.' || ia.INDEXNAME || '_STORAGE_TAB  VALUES (''' || newval || ''' , ''' || rid || ''' )';
      EXECUTE IMMEDIATE stmt;
   end if;

   RETURN ODCICONST.SUCCESS;
  END;



Спасибо
...
Рейтинг: 0 / 0
26.12.2021, 14:18
    #40123150
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
HOME_X
Как правильно достучаться до необходимых полей таблицы

Проиндексировать KEY1+KEY2+KEYn
...
Рейтинг: 0 / 0
26.12.2021, 15:21
    #40123158
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
andrey_anonymous
HOME_X
Как правильно достучаться до необходимых полей таблицы

Проиндексировать KEY1+KEY2+KEYn


KEY "NNNN" !!! - там 15 полей, которые совершенно не нужны.

Может есть более рацион. варианты ?

P.S. - можно представить как ВЫРАЖЕНИЕ индекса (SC,KEY1+KEY2+.....+KEYn)
...
Рейтинг: 0 / 0
26.12.2021, 16:50
    #40123177
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
HOME_X
KEY "NNNN" !!! - там 15 полей, которые совершенно не нужны.

Не нужны - не индексируйте, в чем проблема?
Смысл в том, что индекс не должен лазить в таблицу, на которой построен - вся необходимая информация должна попадать в него согласно декларации.
...
Рейтинг: 0 / 0
28.12.2021, 10:46
    #40123539
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
andrey_anonymous,

Решил задачу через объектный тип - ниже приложено
---------------------------------------------------------------

А как решить это через массив ?
Имею в виду тип SYS.ODCIColInfoList dbms_output.put_line(iA.INDEXCOLS(???).COLNAME);

И предложение вызова
create index EMPLOYEES_DELAY on EMPLOYEES(SALARY,KEY1,KEY2) indextype is CARD_DELAY_INDEXTYPE;
Как правильно декларировать сигнатуру ?

Код: 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.
create or replace type NUMBER2 authid current_user as object
(
  MainVal Number,
  KeysVal Number
)

Create or replace type CARD_DELAY authid current_user as object
(
  CurNum      Number,
  HowMany     Number,
  Lower_Bound Number,
  Upper_Bound 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 ODCIINDEXTRUNCATE(iA SYS.ODCIIndexInfo,Env SYS.ODCIEnv)                                          Return Number,
  Static function ODCIINDEXINSERT  (iA SYS.ODCIIndexInfo,Rid Rowid,Newval Number2,Env SYS.ODCIEnv)                 Return Number,
  Static function ODCIINDEXDELETE  (iA SYS.ODCIIndexInfo,Rid Rowid,Oldval Number2,Env SYS.ODCIEnv)                 Return Number,
  Static function ODCIINDEXUPDATE  (iA SYS.ODCIIndexInfo,Rid Rowid,Oldval Number2,Newval Number2,Env SYS.ODCIEnv)  Return Number,
  Static function ODCIINDEXSTART   (Sctx In Out Card_Delay,iA SYS.ODCIIndexInfo,Op SYS.ODCIPredInfo,Qi SYS.ODCIQueryInfo,Strt Number,Stop Number,Lower_Pos Number,Upper_Pos Number,Env SYS.ODCIEnv) Return Number,
  Member function ODCIINDEXFETCH   (Self In Out Card_Delay,nRows Number,Rids Out SYS.ODCIRidList,Env SYS.ODCIEnv) Return Number,
  Member function ODCIINDEXCLOSE   (Env SYS.ODCIEnv) Return Number
);

  Static function ODCIINDEXCREATE(iA SYS.ODCIIndexInfo,Parms Varchar2,Env SYS.ODCIEnv) Return Number
  is
    Stmt Varchar2(2000):='Create Table   '||iA.INDEXSCHEMA||'.'||iA.INDEXNAME||'_STORAGE_TAB(COL_VAL,BASE_ROWID,constraint PK primary key(COL_VAL,BASE_ROWID)) organization index as select '/*||iA.INDEXCOLS(1).COLNAME*/||'SALARY,ROWID from '||iA.INDEXCOLS(1).TABLESCHEMA||'.'||iA.INDEXCOLS(1).TABLENAME;
  begin
    --dbms_output.put_line(iA.INDEXCOLS(???).COLNAME);
    Execute Immediate Stmt;
    Return  ODCIConst.Success;
  end;

  Static function ODCIINDEXINSERT(iA SYS.ODCIIndexInfo,Rid Rowid,Newval Number2,Env SYS.ODCIEnv) Return Number
  is
    Stmt Varchar2(2000):='Insert into    '||iA.INDEXSCHEMA||'.'||iA.INDEXNAME||'_STORAGE_TAB values('''||Newval.MainVal||''','''||Rid||''')';
  begin
    if NewVal.KeysVal>0 then 
      Execute Immediate Stmt; 
    end if;
    Return  ODCIConst.Success;
  end;

  create index EMPLOYEES_DELAY on EMPLOYEES(Number2(SALARY,KEY1+KEY2)) indextype is CARD_DELAY_INDEXTYPE;
...
Рейтинг: 0 / 0
29.12.2021, 10:31
    #40123823
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
HOME_X
create index EMPLOYEES_DELAY on EMPLOYEES(SALARY,KEY1,KEY2) indextype is CARD_DELAY_INDEXTYPE;

Составной ODCIIndex я делал только через вспомогательный объектный тип
Код: plsql
1.
create index EMPLOYEES_DELAY on EMPLOYEES(MyIdxObj(SALARY,KEY1,KEY2)) indextype is CARD_DELAY_INDEXTYPE;


Но в Вашем случае проще всего было, насколько понимаю, обойтись
Код: plsql
1.
create index EMPLOYEES_DELAY on EMPLOYEES(SALARY+KEY1+KEY2) indextype is CARD_DELAY_INDEXTYPE;
...
Рейтинг: 0 / 0
29.12.2021, 13:53
    #40123909
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
andrey_anonymous

create index EMPLOYEES_DELAY on EMPLOYEES(SALARY+KEY1+KEY2) indextype is CARD_DELAY_INDEXTYPE;

Не совсем так - это пример

Хотел бы видеть такую реализацию
create index EMPLOYEES_DELAY on EMPLOYEES(SALARY,KEY1+KEY2) indextype is CARD_DELAY_INDEXTYPE;

andrey_anonymous

Составной ODCIIndex я делал только через вспомогательный объектный тип

Так реализовал. и понимаю что других вариантов нет ?

Спасибо
...
Рейтинг: 0 / 0
29.12.2021, 14:46
    #40123956
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
HOME_X
других вариантов нет ?

По крайней мере я о них не знаю.
Можно, конечно, на ADT попробовать, но не советовал бы без крайней необходимости.
...
Рейтинг: 0 / 0
29.12.2021, 20:02
    #40124051
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
andrey_anonymous

Можно, конечно, на ADT попробовать, но не советовал бы без крайней необходимости.


А что Вы имеете в виду ?
Изменить структуру индексируемой таблицы ?
Переведя ее на один/несколько пользов. типов

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create type name_type
(
   first_name    char(40),
   last_name     char(40)
);
 
create type full_address_type
(
   street_address char(40),
   city               char(40),
   state             char(2),
   zip_code      number(9)
);
 
CREATE TABLE customer
(
     cust_name                  name_type,
     cust_address              full_address_type,
);
...
Рейтинг: 0 / 0
30.12.2021, 13:38
    #40124161
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
HOME_X
andrey_anonymous

Можно, конечно, на ADT попробовать, но не советовал бы без крайней необходимости.

А что Вы имеете в виду ?

ANYDATA/ANYDATASET/ANYTYPE или хакнуть "<ADT_1>"
...
Рейтинг: 0 / 0
09.01.2022, 21:18
    #40125386
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
andrey_anonymous

ANYDATA/ANYDATASET/ANYTYPE или хакнуть "<ADT_1>"


Не понял Вас - уточните Ваше предложение

Я хотел бы видеть такое SQL предложение = (SALARY,KEY1+KEY2)
Код: plsql
1.
create index EMPLOYEES_DELAY on EMPLOYEES(SALARY,KEY1+KEY2) indextype is CARD_DELAY_INDEXTYPE;



Без пользовательского типа все равно не обойтись MyIdxObj
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create type MyIdxObj
(
   Exe   char(50),
   Key    integer  
);

create index EMPLOYEES_DELAY on EMPLOYEES(MyIdxObj(SALARY,KEY1+KEY2)) indextype is CARD_DELAY_INDEXTYPE;

Правим на Newval ANYDATA

Static function ODCIINDEXINSERT(iA SYS.ODCIIndexInfo,Rid Rowid,Newval ANYDATA,Env SYS.ODCIEnv) Return Number
is
  v_my_objects_tab  my_anydata_table;
  v_dummy NUMBER;
  v_result NUMBER := 0;
  BEGIN
    v_dummy := NewVal.GetCollection(v_my_objects_tab);
    dbms_output.put_line(NewVal.GetTypeName);                            -- ВЕРНУ MyIdxObj
    for v_i in v_my_objects_tab.FIRST..v_my_objects_tab.LAST loop  
      v_result := v_result+v_my_objects_tab(v_i).key;   -- верну значение ключа и имя ключа
    end loop;
    Return  ODCIConst.Success;
  end;



Я хотел избавиться от типа MyIdxObj
Или Вы имели в виду что-то другое ? приведите пожалуйста пример
...
Рейтинг: 0 / 0
30.01.2022, 12:05
    #40130563
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
Вячеслав Любомудров

А кто заставляет использовать execute immediate?
Юзай dbms_sql.
Сделай ассоциативный массив с ключем ia.INDEXSCHEMA || '.' || ia.INDEXNAME и содержащий номер открытого и распарсенного курсора (с использованием placeholder-ов) и тебе останется только прибиндить нужные значения и выполнить его.


Здесь НЕ все понятно ! как и чем определить момент окончания процесса.

Вариант 1
- пошла вставка записей - событие ODCIINDEXINSERT отрабатывает запись, за записью
Пишем в массив, когда возникла ПОСЛЕДНАЯ запись - делаем вставку в таблицу
Как определить эту последную запись ?

Вариант 2
Создать и контролировать курсором курсор можно через ПЕРВЫЙ запуск стат. функцию
контролировать через условие > 0 и делать вставку, а как его закрыть после окончания
процесса вставки ?
Каким событием-процедурой определить этот факт ПОСЛЕДНЕЙ записи ?

--------------------------------------------------------------------------------------
member function OdciIndexClose (Env SYS.ODCIEnv) Return Number
Для других целей и работает для SELECT при уже созданном объекте.

Спасибо
...
Рейтинг: 0 / 0
31.01.2022, 11:40
    #40130693
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
HOME_X
- пошла вставка записей - событие ODCIINDEXINSERT отрабатывает запись, за записью
Пишем в массив, когда возникла ПОСЛЕДНАЯ запись - делаем вставку в таблицу
Как определить эту последную запись ?

Возможно, подойдет batch-интерфейс odciIndexInsert?
Код: plsql
1.
2.
3.
4.
5.
6.
FUNCTION ODCIIndexInsert(
   ia ODCIIndexInfo,
   ridlist ODCIRidList,
   newvallist varray_of_column_type,
   env ODCIEnv) 
RETURN NUMBER
...
Рейтинг: 0 / 0
04.02.2022, 11:59
    #40131655
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регламент или Extensible Indexing
andrey_anonymous,

Спасибо за подсказку Andrey - отработал !

Прошу ответить на вопросы
Пример 1 - выполнился ожидаемо
Вопрос - как и чем контролируется размерность массива К ВСТАВКЕ
См. результат консоли - массив из 300 строк - разрезан на части с тремя обращениями 200-55-45
Основаня проблема - когда делать execute immediate ? (Частями делать ?)
Код: 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.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
drop index     test_INDEX;
drop table     test_table;
drop indextype test_index_type;
drop operator  test_eq;
drop function  test_eq_fun;
drop type      index_methods;
drop type      Number2List;
drop type      number2;

create or replace type Number2 authid current_user as object
(
  Keys Number(18,2)
);
CREATE OR REPLACE TYPE Number2List AS VARRAY(32767) of Number2;
CREATE OR REPLACE TYPE 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 ODCIIndexAlter (ia sys.ODCIIndexInfo, parms IN OUT VARCHAR2, altopt number, env sys.ODCIEnv) RETURN NUMBER,
  STATIC FUNCTION ODCIIndexDrop(ia SYS.ODCIIndexInfo, env SYS.ODCIEnv) RETURN NUMBER,
  STATIC FUNCTION ODCIIndexExchangePartition(ia SYS.ODCIIndexInfo, ia1 SYS.ODCIIndexInfo, env SYS.ODCIEnv) RETURN NUMBER,
  STATIC FUNCTION ODCIIndexUpdPartMetadata(ia sys.ODCIIndexInfo, palist sys.ODCIPartInfoList, env sys.ODCIEnv) RETURN NUMBER,

  STATIC FUNCTION ODCIIndexInsert(ia in sys.ODCIIndexInfo, ridlist in sys.ODCIRidList, newvallist in Sys.ODCINumberList, env in SYS.ODCIEnv) RETURN NUMBER,
  static function OdciIndexInsert(iA SYS.ODCIINDEXINFO, Rid varchar2, Newval number,                                 Env SYS.ODCIEnv) Return Number,
  STATIC FUNCTION ODCIIndexDelete(ia SYS.ODCIIndexInfo, rid VARCHAR2, oldval number,                                 env SYS.ODCIEnv) RETURN NUMBER,
  STATIC FUNCTION ODCIIndexUpdate(ia SYS.ODCIIndexInfo, rid VARCHAR2, oldval number, newval number,                 env SYS.ODCIEnv) RETURN NUMBER,

  STATIC FUNCTION ODCIIndexStart(sctx IN OUT index_methods, ia SYS.ODCIIndexInfo,op SYS.ODCIPredInfo, qi sys.ODCIQueryInfo, strt number, stop number, cmpval number, env SYS.ODCIEnv) RETURN NUMBER,
  MEMBER FUNCTION ODCIIndexFetch(self IN OUT index_methods, nrows NUMBER, rids OUT SYS.ODCIridlist, env SYS.ODCIEnv) RETURN NUMBER,
  MEMBER FUNCTION ODCIIndexClose(self IN index_methods, env SYS.ODCIEnv) RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY index_methods IS

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 ODCIGetInterfaces;

STATIC FUNCTION ODCIIndexCreate (ia sys.ODCIIndexInfo, parms VARCHAR2,  env sys.ODCIEnv) RETURN NUMBER IS
BEGIN
  dbms_output.put_line('Create');
  RETURN ODCIConst.Success;
END ODCIIndexCreate;

STATIC FUNCTION ODCIIndexDrop(ia sys.ODCIIndexInfo, env sys.ODCIEnv) RETURN NUMBER IS
BEGIN
  dbms_output.put_line('Drop');
  RETURN ODCIConst.Success;
END ODCIIndexDrop;

STATIC FUNCTION ODCIIndexAlter (
  ia sys.ODCIIndexInfo,
  parms IN OUT VARCHAR2,
  altopt NUMBER,
  env sys.ODCIEnv)
RETURN NUMBER IS
BEGIN
  dbms_output.put_line('Alter');
  RETURN ODCIConst.Success;
END ODCIIndexAlter;

STATIC FUNCTION ODCIIndexUpdPartMetadata(
  ia sys.ODCIIndexInfo,
  palist sys.ODCIPartInfoList,
  env sys.ODCIEnv)
RETURN NUMBER IS
BEGIN
  dbms_output.put_line('Metadata');
  RETURN ODCIConst.Success;
END ODCIIndexUpdPartMetadata;

STATIC FUNCTION ODCIIndexExchangePartition(
  ia sys.ODCIIndexInfo,
  ia1 sys.ODCIIndexInfo,
  env sys.ODCIEnv)
RETURN NUMBER IS 
BEGIN
  dbms_output.put_line('Partition');
  RETURN ODCIConst.Success;
END ODCIIndexExchangePartition;

static function OdciIndexInsert(iA SYS.ODCIINDEXINFO,Rid varchar2,Newval number,               Env SYS.ODCIEnv) Return Number
is 
BEGIN
  dbms_output.put_line('Insert row');
  RETURN ODCIConst.Success;
END OdciIndexInsert;
                                                                                              
STATIC FUNCTION ODCIIndexInsert(ia sys.ODCIIndexInfo,ridlist sys.ODCIRidList,newvallist sys.ODCINumberList,env sys.ODCIEnv) RETURN NUMBER 
IS
  I Integer;
  C Integer; 
BEGIN 
  C:=ridList.Count;
  dbms_output.put_line('Insert array='||C);
  return ODCIConst.Success;
END;

STATIC FUNCTION ODCIIndexDelete(
   ia SYS.ODCIIndexInfo,
   rid VARCHAR2,
   oldval number,
   env SYS.ODCIEnv)
RETURN NUMBER IS
BEGIN
  dbms_output.put_line('Delete');
  return ODCIConst.Success;
END;

STATIC FUNCTION ODCIIndexUpdate(
   ia SYS.ODCIIndexInfo,
   rid VARCHAR2,
   oldval number,
   newval number,
   env SYS.ODCIEnv)
RETURN NUMBER AS
BEGIN
  dbms_output.put_line('Update');
  return ODCIConst.Success;
END;

STATIC FUNCTION ODCIIndexStart(
  sctx IN OUT index_methods,
  ia SYS.ODCIIndexInfo,
  op SYS.ODCIPredInfo,
  qi sys.ODCIQueryInfo,
  strt number,
  stop number,
  cmpval  number,
  env SYS.ODCIEnv)
RETURN NUMBER AS 
BEGIN
  sctx := index_methods(1);
  dbms_output.put_line('Start');
  return ODCIConst.Success;
END;

MEMBER FUNCTION ODCIIndexFetch(
  self IN OUT index_methods,
  nrows NUMBER,
  rids OUT SYS.ODCIridlist,
  env SYS.ODCIEnv)
RETURN NUMBER AS
BEGIN
  dbms_output.put_line('Fetch');
  return ODCIConst.Success;
END;

MEMBER FUNCTION ODCIIndexClose(self IN index_methods, env SYS.ODCIEnv) RETURN NUMBER AS
BEGIN
  dbms_output.put_line('Close');
  return ODCIConst.Success;
END;

end;
/
CREATE OR REPLACE FUNCTION test_eq_fun(a number, b number) RETURN NUMBER AS
BEGIN
  dbms_output.put_line('Execute');
  IF a = b then RETURN 1; ELSE RETURN 0; END IF;
END;
/
CREATE or replace OPERATOR test_eq          BINDING (number, number) RETURN NUMBER 
--with index context, scan context index_methods 
USING test_eq_fun;

/

CREATE INDEXTYPE test_index_type FOR test_eq(number, number) USING index_methods WITH ARRAY DML;
--WITH LOCAL RANGE PARTITION
--WITH SYSTEM MANAGED STORAGE TABLES;
--COMMIT;
CREATE TABLE test_table (id NUMBER(18,2),nm varchar2(10));
CREATE INDEX test_index ON test_table(id) INDEXTYPE IS test_index_type;
insert into test_table values(0,'One');
insert into test_table select A.* from (select LEVEL F1,'Array' F2 from DUAL connect by LEVEL<301) A;
commit;
select * 
  from test_table
 where test_eq(1,1)=1;


-----Консоль запроса ------------
Drop
Create
Insert row
Insert array=200
Insert array=55
Insert array=45
Execute
------------------------------------

Вопрос 2 в качестве индексируемого поля я использую переменную объектного типа
(точнее мне надо анализировать несколько полей , я их в продуктиве сведу в тип RECORD - отсюда обьект. тип)
попытался реализовать с типом - но событие Insert -ARRAY не реагирует , допускаю что неверно установил опцию
WITH ARRAY DML(Number2,Number2List)

Документация
Код: plsql
1.
2.
3.
4.
5.
array_DML_clause 
Use this clause to let the indextype support the array interface for the ODCIIndexInsert method.
type and varray_type 
If the data type of the column to be indexed is a user-defined object type, then you must specify this clause to identify the varray varray_type that Oracle should use to hold column values of type. If the indextype supports a list of types, then you can specify a corresponding list of varray types. If you omit schema for either type or varray_type, then Oracle assumes the type is in your own schema.
If the data type of the column to be indexed is a built-in system type, then any varray type specified for the indextype takes precedence over the ODCI types defined by the system.



Взгяните плис - пользовательский тип Number2, Number2List
Код: 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.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
drop index     test_INDEX;
drop table     test_table;
drop indextype test_index_type;
drop operator  test_eq;
drop function  test_eq_fun;
drop type      index_methods;
drop type      Number2List;
drop type      number2;

create or replace type Number2 authid current_user as object
(
  Keys Number(18,2)
);
CREATE OR REPLACE TYPE Number2List AS VARRAY(32767) of Number2;
CREATE OR REPLACE TYPE 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 ODCIIndexAlter (ia sys.ODCIIndexInfo, parms IN OUT VARCHAR2, altopt number, env sys.ODCIEnv) RETURN NUMBER,
  STATIC FUNCTION ODCIIndexDrop(ia SYS.ODCIIndexInfo, env SYS.ODCIEnv) RETURN NUMBER,
  STATIC FUNCTION ODCIIndexExchangePartition(ia SYS.ODCIIndexInfo, ia1 SYS.ODCIIndexInfo, env SYS.ODCIEnv) RETURN NUMBER,
  STATIC FUNCTION ODCIIndexUpdPartMetadata(ia sys.ODCIIndexInfo, palist sys.ODCIPartInfoList, env sys.ODCIEnv) RETURN NUMBER,

  STATIC FUNCTION ODCIIndexInsert(ia in sys.ODCIIndexInfo, ridlist in sys.ODCIRidList, newvallist in Number2List, Env in SYS.ODCIEnv) RETURN NUMBER,
  static function OdciIndexInsert(iA SYS.ODCIINDEXINFO, Rid varchar2, Newval Number2,                             Env SYS.ODCIEnv) Return Number,
  STATIC FUNCTION ODCIIndexDelete(ia SYS.ODCIIndexInfo, rid VARCHAR2, Oldval Number2,                             Env SYS.ODCIEnv) RETURN NUMBER,
  STATIC FUNCTION ODCIIndexUpdate(ia SYS.ODCIIndexInfo, rid VARCHAR2, Oldval Number2, Newval Number2,             Env SYS.ODCIEnv) RETURN NUMBER,

  STATIC FUNCTION ODCIIndexStart(sctx IN OUT index_methods, ia SYS.ODCIIndexInfo,op SYS.ODCIPredInfo, qi sys.ODCIQueryInfo, strt number, stop number, cmpval number, env SYS.ODCIEnv) RETURN NUMBER,
  MEMBER FUNCTION ODCIIndexFetch(self IN OUT index_methods, nrows NUMBER, rids OUT SYS.ODCIridlist, env SYS.ODCIEnv) RETURN NUMBER,
  MEMBER FUNCTION ODCIIndexClose(self IN index_methods, env SYS.ODCIEnv) RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY index_methods IS

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 ODCIGetInterfaces;

STATIC FUNCTION ODCIIndexCreate (ia sys.ODCIIndexInfo, parms VARCHAR2,  env sys.ODCIEnv) RETURN NUMBER IS
BEGIN
  dbms_output.put_line('Create');
  RETURN ODCIConst.Success;
END ODCIIndexCreate;

STATIC FUNCTION ODCIIndexDrop(ia sys.ODCIIndexInfo, env sys.ODCIEnv) RETURN NUMBER IS
BEGIN
  dbms_output.put_line('Drop');
  RETURN ODCIConst.Success;
END ODCIIndexDrop;

STATIC FUNCTION ODCIIndexAlter (
  ia sys.ODCIIndexInfo,
  parms IN OUT VARCHAR2,
  altopt NUMBER,
  env sys.ODCIEnv)
RETURN NUMBER IS
BEGIN
  dbms_output.put_line('Alter');
  RETURN ODCIConst.Success;
END ODCIIndexAlter;

STATIC FUNCTION ODCIIndexUpdPartMetadata(
  ia sys.ODCIIndexInfo,
  palist sys.ODCIPartInfoList,
  env sys.ODCIEnv)
RETURN NUMBER IS
BEGIN
  dbms_output.put_line('Metadata');
  RETURN ODCIConst.Success;
END ODCIIndexUpdPartMetadata;

STATIC FUNCTION ODCIIndexExchangePartition(
  ia sys.ODCIIndexInfo,
  ia1 sys.ODCIIndexInfo,
  env sys.ODCIEnv)
RETURN NUMBER IS 
BEGIN
  dbms_output.put_line('Partition');
  RETURN ODCIConst.Success;
END ODCIIndexExchangePartition;

static function OdciIndexInsert(iA SYS.ODCIINDEXINFO,Rid varchar2,Newval number2,               Env SYS.ODCIEnv) Return Number
is 
BEGIN
  dbms_output.put_line('Insert row');
  RETURN ODCIConst.Success;
END OdciIndexInsert;
                                                                                              
STATIC FUNCTION ODCIIndexInsert(ia sys.ODCIIndexInfo,ridlist sys.ODCIRidList,newvallist Number2List,env sys.ODCIEnv) RETURN NUMBER 
IS
  I Integer;
  C Integer; 
BEGIN 
  C:=ridList.Count;
  dbms_output.put_line('Insert array='||C);
  return ODCIConst.Success;
END;

STATIC FUNCTION ODCIIndexDelete(
   ia SYS.ODCIIndexInfo,
   rid VARCHAR2,
   oldval number2,
   env SYS.ODCIEnv)
RETURN NUMBER IS
BEGIN
  dbms_output.put_line('Delete');
  return ODCIConst.Success;
END;

STATIC FUNCTION ODCIIndexUpdate(
   ia SYS.ODCIIndexInfo,
   rid VARCHAR2,
   oldval number2,
   newval number2,
   env SYS.ODCIEnv)
RETURN NUMBER AS
BEGIN
  dbms_output.put_line('Update');
  return ODCIConst.Success;
END;

STATIC FUNCTION ODCIIndexStart(
  sctx IN OUT index_methods,
  ia SYS.ODCIIndexInfo,
  op SYS.ODCIPredInfo,
  qi sys.ODCIQueryInfo,
  strt number,
  stop number,
  cmpval  number,
  env SYS.ODCIEnv)
RETURN NUMBER AS 
BEGIN
  sctx := index_methods(1);
  dbms_output.put_line('Start');
  return ODCIConst.Success;
END;

MEMBER FUNCTION ODCIIndexFetch(
  self IN OUT index_methods,
  nrows NUMBER,
  rids OUT SYS.ODCIridlist,
  env SYS.ODCIEnv)
RETURN NUMBER AS
BEGIN
  dbms_output.put_line('Fetch');
  return ODCIConst.Success;
END;

MEMBER FUNCTION ODCIIndexClose(self IN index_methods, env SYS.ODCIEnv) RETURN NUMBER AS
BEGIN
  dbms_output.put_line('Close');
  return ODCIConst.Success;
END;

end;
/
CREATE OR REPLACE FUNCTION test_eq_fun(a number, b number) RETURN NUMBER AS
BEGIN
  dbms_output.put_line('Execute');
  IF a = b then RETURN 1; ELSE RETURN 0; END IF;
END;
/
CREATE or replace OPERATOR test_eq          BINDING (number, number) RETURN NUMBER 
--with index context, scan context index_methods 
USING test_eq_fun;

/

CREATE INDEXTYPE test_index_type FOR test_eq(number, number) USING index_methods WITH ARRAY DML(Number2,Number2List);
--WITH LOCAL RANGE PARTITION
--WITH SYSTEM MANAGED STORAGE TABLES;
--COMMIT;
CREATE TABLE test_table (id NUMBER(18,2),nm varchar2(10));
CREATE INDEX test_index ON test_table(Number2(id)) INDEXTYPE IS test_index_type;
insert into test_table values(0,'One');
insert into test_table select A.* from (select Level F1,'Array' F2 from DUAL connect by LEVEL<301) A;
commit;
select * 
  from test_table
 where test_eq(1,1)=1;


-----Консоль запроса ------------
Drop
Create
Insert row
.................
Insert row
Execute
------------------------------------

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


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