Добрый вечер.
Наткнулся на непонятный баг, пытаясь задействовать такую фичу Oracle как Extensible Indexing (если кратко, то она позволяет определять свои собственные типы индексов)
Ниже код, сразу оговорюсь - упрощен по самое немогу. some_idxtype_im - реализация интерфейса ODCI по типу NUMBER
sva@solus:~$ cat tosqlru.sql
create or replace
TYPE some_idxtype_im as object (
curnum number,
static function ODCIGetinterfaces (ifclist out nocopy sys.ODCIObjectList) return number,
static function ODCIIndexCreate
(ia sys.ODCIindexinfo, parms varchar2, env sys.ODCIEnv) return number,
static function ODCIIndexTruncate (ia sys.ODCIindexinfo,
env sys.ODCIEnv) return number,
static function ODCIIndexDrop (ia sys.ODCIindexinfo,
env sys.ODCIEnv) return number,
static function ODCIIndexInsert (ia sys.ODCIindexinfo, rid rowid,
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 nocopy some_idxtype_im, ia sys.ODCIindexinfo,
op sys.ODCIPredinfo, qi sys.ODCIQueryinfo,
strt number, stop number, val number, env sys.ODCIEnv) return number,
static function ODCIIndexFetch (slf in out nocopy some_idxtype_im, nrows in number,
rids out nocopy sys.ODCIRidList, env sys.ODCIEnv)
return number,
static function ODCIIndexClose (slf some_idxtype_im, env sys.ODCIEnv) return number
)
/
create or replace
TYPE body some_idxtype_im is
static function ODCIGetinterfaces (ifclist out nocopy 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
stm varchar2(1000);
begin
/* создаем таблицу для хранения данных индекса - все по букварю */
stm := 'create table ' || ia.IndexSchema || '.' || ia.IndexName || '_idx ' ||
'( r rowid, idxval number)';
dbms_output.put_line (stm);
execute immediate stm;
/* делаем нечто полезное */
return ODCIConst.SUCCESS;
end;
static function ODCIIndexTruncate (ia sys.ODCIindexinfo,
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 rowid,
newval number, env sys.ODCIEnv) return number is
begin
/* делаем нечто полезное */
return ODCIConst.SUCCESS;
end;
static function ODCIIndexDelete (ia sys.ODCIindexinfo, rid varchar2, oldval number,
env sys.ODCIEnv) return number is
begin
/* делаем нечто полезное */
return ODCIConst.SUCCESS;
end;
static function ODCIindexUpdate (ia sys.ODCIindexinfo, rid varchar2, oldval number,
newval number, env sys.ODCIEnv) return number is
begin
/* делаем нечто полезное */
return ODCIConst.SUCCESS;
end;
static function ODCIIndexStart (sctx in out nocopy some_idxtype_im, ia sys.ODCIindexinfo,
op sys.ODCIPredinfo, qi sys.ODCIQueryinfo,
strt number, stop number, val number, env sys.ODCIEnv) return number is
begin
/* делаем нечто полезное */
return ODCIConst.SUCCESS;
end;
static function ODCIIndexFetch (slf in out nocopy some_idxtype_im, nrows in number,
rids out nocopy sys.ODCIRidList, env sys.ODCIEnv)
return number is
begin
/* делаем нечто полезное */
return ODCIConst.SUCCESS;
end;
static function ODCIIndexClose (slf some_idxtype_im, env sys.ODCIEnv) return number is
begin
/* делаем нечто полезное */
return ODCIConst.SUCCESS;
end;
end;
/
create or replace function some_fnc (a number, b number) return number is
begin
return 1;
end;
/
create or replace operator some_op binding (number, number) return number using some_fnc
/
create or replace indextype some_idxtype for
some_op (number, number)
using some_idxtype_im;
дальше пробуем
SQL> conn / as sysdba
Connected.
SQL> create user medved identified by preved;
User created.
SQL> grant connect, resource to medved;
Grant succeeded.
SQL> conn medved/preved
Connected.
SQL> @tosqlru.sql
Type created.
Type body created.
Function created.
Operator created.
Indextype created.
SQL> create table tbl (value number);
Table created.
SQL> set serverouput on;
SQL> create index p on tbl (value) indextype is some_idxtype;
create table MEDVED.P_idx ( r rowid, idxval number)
create index p on tbl (value) indextype is some_idxtype
*
ERROR at line 1:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-01031: insufficient privileges
ORA-06512: at "MEDVED.SOME_IDXTYPE_IM", line 14
SQL> create table MEDVED.P_idx ( r rowid, idxval number);
Table created.
SQL>
Ошибка именно на создании таблицы индекса.
Не пойму в чем дело, ткните носом если что.
ну и второй вопрос даже незнаю как это назвать:
SQL> select bitand (18446744069414584320, 65535) from dual;
BITAND(18446744069414584320,65535)
----------------------------------
65535
???
БД была:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
и
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
PL/SQL Release 9.2.0.6.0 - Production
CORE 9.2.0.6.0 Production
TNS for Linux: Version 9.2.0.6.0 - Production
NLSRTL Version 9.2.0.6.0 - Production
Заранее спасибо.