Столкнулся со странным поведением ORACLE

AndrykV
Дата: 20.10.2015 10:17:00
Беру простой запрос
select count(1)
  from ALL_TAB_PARTITIONS

получаю результат 2132

создаю функцию

create or replace TEST_COUNT return number as
  res number;
begin
  select count(1)
    into res
    from ALL_TAB_PARTITIONS;
  return res;
end;

делаю запрос
select test_count from dual

получаю 0?! Что за фигня?

Oracle 11.2.0.4.0
orawish
Дата: 20.10.2015 10:24:03
AndrykV,

топ 4
AndrykV
Дата: 20.10.2015 10:51:26
orawish,

А Семен Семеныч!!

Блин, просто имено ошибки никакай не выдало, потому и не сообразил, а видимо что на ALL_TAB_PARTITIONS есть public synonym, то процедура скомпилировалась, но при выполнении возвращает пустой запрос...
блин, лучше бы не компилировалась.

Спасибо за помощь...
Elic
Дата: 20.10.2015 11:03:27
AndrykV
Спасибо за помощь...
Ты ни черта не понял.
AndrykV
Дата: 20.10.2015 11:13:15
Elic,

Да? В чем именно я заблуждаюсь?
Elic
Дата: 20.10.2015 11:35:45
AndrykV
В чем именно я заблуждаюсь?
Во многом. Например, во мнимой "связи" с синонимами.
AndrykV
Дата: 20.10.2015 11:47:23
Elic,

Я так понимаю, что ты тут "Ходжа Насредин" местный?
Если есть что сказать, говори, нет, так не зачем флудить...

Однажды Моллу стали упрашивать прочитать в мечети проповедь. Насреддин долго отнекивался, но люди не отставали. Наконец Молла взобрался на минбар и обратился к верующим с такими словами:
– Добрые люди, знаете ли вы, о чем я буду говорить?
– Нет, – ответили слушатели, – не знаем.
Насреддин, разгневанный, сошел с минбара и воскликнул:
– Коли уж вы такие невежды, то нечего с вами зря время тратить! – и пошел к себе домой.
На другой день Насреддин пришел в мечеть, поднялся на минбар и обратился к собравшимся с тем же вопросом. Люди посовещались с собой и в один голос ответили:
– Конечно, знаем.
– Ну, коли вы сами все знаете, – сказал Насреддин, – то и рассказывать вам нечего.
Он сошел с минбара и отправился восвояси, а слушатели решили ответить в следующий раз, что одни знают, о чем речь, а другие нет, чтобы Насреддину пришлось все–таки сказать что–нибудь.
На третий день Насреддин опять поднялся на минбар и повторил свой вопрос.
Слушатели закричали, что одни знают о чем он будет говорить, а другие – нет.
Тогда Насреддин смекнул, что его хотят провести, не растерялся и сказал:
– Прекрасно. Пусть те, кто знает, расскажут тем, кто не знает.

Источник статьи: http://secretworlds.ru/publ/pritchi_i_skazki/pritchi_pro_nasreddina/100_istorij_o_khodzhe_nasreddine/110-1-0-10199#ixzz3p60WgkKp
Elic
Дата: 20.10.2015 11:50:31
AndrykV
Если есть что сказать, говори, нет, так не зачем флудить...
Оставайся со своими заблуждениями наедине.
Zloxa
Дата: 20.10.2015 12:06:58
AndrykV,

Оракл бы руганулся, если бы пользователю не была бы дана привелегия на вызов all_tab_partitions. Но такая привелегия у твоей схемы есть. В твоей функции, запрос будет исполнять от имени defiter, а при работе от создателя, отключаются привилегии, выданные через роль . Т.к. представления all_* возвращают список объектов, на доступ к которым у пользователя есть привелегии, будучи завернутым в функцию, эти запросы перестанут возвращать объекты, привилегии на которые назначены пользователю через роль.
AndrykV
Дата: 20.10.2015 12:32:06
Zloxa,

Спасибо за ответ.

Т.е. получается что процедура и функция это слишком разные сущности в оракле?
потому как такая процедура
create or replace procedure procedure1 as 
  res number := 0;
begin
  for cr in (select *
    --into res 
    from SYS.ALL_TAB_PARTITIONS) loop
    res := res +1;
  end loop;
end procedure1;

Совершенно спокойно выполняется и в дебагере заходит внутрь цикла.

Если не трудно дайте "тынц"(ссылку) на доку где это описано, если честно раньше никогда не задумывался над такой разницой функций и процедур.

Спасибо.