По-разному идет обработка

ХП и права
Дата: 04.12.2007 16:57:18
Не могу понять почему происходит следующее:
1. Пакет
FUNCTION CHANGE_MESSAGE(
    IN_OWNER IN VARCHAR2,
    IN_TABLE_NAME IN VARCHAR2) RETURN VARCHAR2
IS
  CURSOR COMMENT_CUR
  IS
     SELECT
        T1.COMMENTS
     FROM
        ALL_TAB_COMMENTS T1
     WHERE
        (T1.OWNER = UPPER(IN_OWNER)) AND
        (T1.TABLE_NAME = UPPER(IN_TABLE_NAME));
    v_MSG VARCHAR2(250);
BEGIN
    OPEN COMMENT_CUR;
    FETCH COMMENT_CUR INTO v_MSG;
    CLOSE COMMENT_CUR;
    RETURN v_MSG;
END;

2. Пакет с такой же процедурой, но возвращающей REF CURSOR для отчета Crystal Report.

3. В SQL Plus - обычный запрос к ALL_TAB_COMMENTS с теми же ограничениями.

Все три пункта выполняются под одним и темже пользователем, пакет создается под ним же.
В пункте 1 - не находяться данные,
в пунктах 2 и 3 значение возвращается.
На таблицу, комментарии к которой хочу посмотреть, назначено право на SELECT через роль (находится в другой схеме), поэтому в пункте 1 и не выводятся данные, а п. 3 выводятся.
Но почему они выводятся в пункте 2? Какаю же команду дает Crystal Report?
Что можно сделать с пунктом 1, чтобы он выполнялся (кроме AUTHID CURRENT_USER, прямого назначения прав) ?
Спасибо.
_Alex_SMIRNOV_
Дата: 04.12.2007 17:10:40
Jannny
Дата: 04.12.2007 17:13:32
В основном ТОП №4

ХП и права
Что можно сделать с пунктом 1, чтобы он выполнялся (кроме AUTHID CURRENT_USER, прямого назначения прав) ?
смотреть на dba_(*), но это будет не совсем тоже самое. Вы уверены, что Вам надо смотреть только среди того, что доступно вызывающему пользователю?
ХП и права
Дата: 04.12.2007 17:22:02
Не совсем Top 4.

Пункт 2 - в пакете ХП, выполняемая в отчете, но она, вот чудеса, работает!!!
Но вот почему?
PROCEDURE PRINT_PROBA_COM(
    IN_OUT_REPORT_CURSOR IN OUT ASU.PB_A.REPORT_CUR_TYPE, --REF CURSOR
    IN_OWNER IN ALL_TAB_COMMENTS.OWNER%TYPE,
    IN_TABLE_NAME IN ALL_TAB_COMMENTS.TABLE_NAME%TYPE)
  IS
  BEGIN
    OPEN IN_OUT_REPORT_CURSOR FOR
      SELECT
        T1.OWNER,
        T1.TABLE_NAME,
        T1.COMMENTS
      FROM
        ALL_TAB_COMMENTS T1
      WHERE
        (T1.OWNER = UPPER(IN_OWNER)) AND
        (T1.TABLE_NAME = UPPER(IN_TABLE_NAME));
  END;
ХП и права
Дата: 04.12.2007 17:34:15
Jannny

Вы уверены, что Вам надо смотреть только среди того, что доступно вызывающему пользователю?

В основном это так, но не всегда.
В некоторых случаях необходимо посмотреть описания, доступные создателю.
Jannny
Дата: 04.12.2007 17:38:24
ХП и права
Пункт 2 - в пакете ХП, выполняемая в отчете, но она, вот чудеса, работает!!!
Но вот почему?
потому что там fetch-а нет.

Ну из ТОП4 там только основное понимание :) Так-то, конечно, не оно. Просто надо понимать, что:
user_ - это объекты пользователя
all_ - это то, что доступно пользователю
dba_ - это всё :)

И теперь зная, что мы в хр. процедуре выполняемся из-под владельца хр. процедуры, то именно он и является "пользователем" в предыдущих сентенциях. Дальше очевидно по-моему?

ХП и права
Jannny
Вы уверены, что Вам надо смотреть только среди того, что доступно вызывающему пользователю?
В основном это так, но не всегда.
В некоторых случаях необходимо посмотреть описания, доступные создателю.
Ну так смотрите в dba
ХП и права
Дата: 04.12.2007 17:41:52
To Jannny
Спасибо.
ХП и права
Дата: 04.12.2007 20:30:37
Может я туплю к вечеру (опять перечитывал Кайта), но все равно ничего не понял. Причем здесь ТОП4!
Я создал пакет (с правами создателя) с двумя процедурами, они приведены выше,
пакет скомпилирован, права на ALL_TAB_COMMENTS есть (напрямую).
ХП и права
На таблицу, комментарии к которой хочу посмотреть, назначено право на SELECT через роль (таблица находится в другой схеме)

Назначено это право (SELECT) создателю пакета!!! и запускающему (одно и тоже лицо).
Передаются эти параметры через IN_OWNER, IN_TABLE_NAME.
При запуске первой функции возвращается (в самой функции этого нет, уменьшал код) NOTFOUND - не выбрано ни одной записи!
При использовании второй процедуры в генераторе отчетов Crystal Reports на экран выводится строка с комментарием (данные выбраны).
Jannny
потому что там fetch-а нет.

Т.е. вы хотите сказать, что я передал отчетнику открытый нетипизированный курсор, он мне вывел данные, а fetch не использовал. Поясните пожалуйста эту технологию.

Так вот не понимаю я почему так происходит, под одним и тем же пользователем (в том числе создателем пакета) процедуры выполняются по-разному.
Как уже говорил прямой SELECT из SQL Plus тоже возвращает строку данных.

Jannny
dba_ - это всё

Под dba_* все работает, но хотелось бы понять данную причину.
Elic
Дата: 05.12.2007 10:15:27
ХП и права
Причем здесь ТОП4!
Совершенно ни при чём.
Интересно получается:
define sql="select count(*) as cnt from all_tab_comments"

create or replace package TmpPkg
as
type refcur is ref cursor;
function Cursor return int;
function RefCursor return refcur;
end TmpPkg;
/

create or replace package body TmpPkg
as
--
function Cursor return int
is
begin
  for x in (&sql) loop
    return x.cnt;
  end loop;
end Cursor;
--
function RefCursor return refcur
is
  c refcur;
begin
  open c for &sql;
  return c;
end RefCursor;
--
end TmpPkg;
/

--1
select TmpPkg.Cursor from dual;
--2
var c refcursor
exec :c := TmpPkg.RefCursor
print c
--3
select * from (&sql);
 9.2.0.8> 1<3, 2=3
10.2.0.3> 1<3, 2=1
На девятке, похоже, бажок.

P.S. RTFM про версию
ХП и права
Дата: 05.12.2007 11:23:10
На 10.2.0.1 точно так же
2=3 и 1<3