[вопрос+код]объектные типы в pl/sql

hrafn
Дата: 20.11.2009 13:33:44
-- создали типы
drop type t_number;
create or replace type t_number as object(id number);
drop type t_arary_number;
create or replace type t_array_number is table of t_number;
/

-- хранимка 
-- парсит массив members_id_in в объектную таблицу
-- после этого вычитываются данные из all_objects по связке array.id = object_id
create or replace procedure test_sp
is
  id number;
  i number := 1;
  j number;
  t_tab t_array_number := t_array_number();
  members_id_in clob := '|2|3|4|5|6|7|8|9|10|';
  clob_len number := dbms_lob.getlength(members_id_in);
begin
  dbms_output.put_line('started...');
  -- creating object table containts members id
  while (i < clob_len) loop
    j := dbms_lob.instr(members_id_in, '|', i + 1);
    id := dbms_lob.substr(members_id_in, j - i - 1, i + 1);
    i := j;
    t_tab.extend();
    t_tab(t_tab.last) := t_number(id);
  end loop;
  
  -- testing    
  select count(1) into i
  from all_objects
  where object_id in (
      select id from TABLE(CAST(t_tab as t_array_number))
    );     
  dbms_output.put_line('items count=' || i);
    
  select count(1) into i from TABLE(CAST(t_tab as t_array_number));  
  dbms_output.put_line('items count=' || i);
     
exception
  when others then
    dbms_output.put_line( substr(sqlerrm, 1, 200) );
end;
/

почему для первого запроса возвращается всегда 0? ответ искал в доках - не нашел.
если соединяем с all_objects, то возвращается всегда 0, но записи с такими object_id в all_objects есть
(второй запрос лишь тест, чтобы убедиться, что в табличку попали все распарсенные данные).


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
suPPLer
Дата: 20.11.2009 13:51:00
hrafn
почему для первого запроса возвращается всегда 0? ответ искал в доках - не нашел.
если соединяем с all_objects, то возвращается всегда 0, но записи с такими object_id в all_objects есть
(второй запрос лишь тест, чтобы убедиться, что в табличку попали все распарсенные данные).


А у меня нету... :)

SQL*Plus: Release 10.1.0.4.2 - Production on Пт Ноя 20 12:45:37 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Присоединен к:
Oracle Database 11g Release 11.2.0.1.0 - Production

SQL> select * from (select object_id from all_objects order by object_id) where rownum < 10;

 OBJECT_ID
----------
       100
       116
       117
       279
       364
       366
       367
       369
       370

9 строк выбрано.

А теперь - бац, и есть:

SQL> conn system
Введите пароль:
Соединено.
SQL> select * from (select object_id from all_objects order by object_id) where rownum < 10;

 OBJECT_ID
----------
         2
         3
         4
         5
         6
         7
         8
         9
        10

9 строк выбрано.

Проверяйте права у того, под кем создаёте процедуру, читайте ТОП4.
Elic
Дата: 20.11.2009 13:53:22
hrafn
почему для первого запроса возвращается всегда 0?
Намёк:
set role all;
declare
  id number;
...
/
started...
items count=9
items count=9
set role none;
declare
...
/
started...
items count=0
items count=9
RTFM ТОП №4
hrafn
Дата: 20.11.2009 14:27:29
странно, потому что dba у юзера есть. под этим же юзером запрос:
select * from (select object_id from all_objects order by object_id) where rownum < 10;
выдает и однозначные числа
но, тем не менее, с all_objects не соединяет.
Babe_Vampire
Дата: 20.11.2009 14:31:52
FAQ вопрос №7
----
Oracle 11.1.0.7 - 64bit - SLES10
Elic
Дата: 20.11.2009 14:38:09
hrafn
странно
Ты совершенно не читаешь того, что тебе пишут.
hrafn
Дата: 20.11.2009 15:47:51
@Babe_Vampire, вы не правы. я могу использовать.

@Elic, я прочитал. один и тот же селект на получение первого десятка записей в анонимной блоке и в хранимке отдает одно и тоже: однозначные числа. или ты сами писатель? rtfm да stfw. ошибка может в чем-то в этом, да вот объяснить видно не с руки
suPPLer
Дата: 20.11.2009 16:25:14
hrafn,

попробуем ещё разик: чтобы видеть объекты в all_objects, нужно либо иметь привилегии на них (SELECT, EXECUTE и т.д.), либо быть их владельцем. Привилегии могут предоставляться через роль или напрямую. В хранимом коде привилегии, предоставленные через роль, НЕ учитываются.

И всё же - RTFM ТОП4.
_Alex_SMIRNOV_
Дата: 20.11.2009 16:39:10
suPPLer
hrafn,

попробуем ещё разик: чтобы видеть объекты в all_objects, нужно либо иметь привилегии на них (SELECT, EXECUTE и т.д.), либо быть их владельцем. Привилегии могут предоставляться через роль или напрямую. В хранимом коде привилегии, предоставленные через роль, НЕ учитываются.

И всё же - RTFM ТОП4.


С малениким дополнением если процедура (пакет) с AUTHID CURRENT_USER то привилегие выданые через роль можно увидеть в all_objects в процедурею (если роль включена)
hrafn
Дата: 20.11.2009 16:39:21
@suPPLer, ясно. спасибо.

фактически это означает, что grant dba to uname. это все равно выдача прав через роль?