pl sql функция с вложенным if и множественным выбором - PullRequest
0 голосов
/ 22 ноября 2011

Запутанная ситуация, так что со мной голая ...

У меня есть вид.представление имеет функцию, которая возвращает текстовую строку «ИСТИНА» или «ЛОЖЬ» на основе двух критериев

функция просматривает две таблицы.

Условие 1: таблица клиента содержитполе даты - если системной датой является> поле даты, оно должно возвращать false

Условие 2: таблица customer ссылается на таблицу customer_detail.иногда в таблице сведений есть запись, а иногда нет (поэтому я добавил в запрос синтаксис внешнего соединения, который на самом деле ничего не делает, потому что дополнительные критерии вынуждают внутреннее объединение, как я полагаю).В таблице customer_detail может быть несколько записей для каждой записи в таблице customer.если в таблице подробностей несколько записей, мне нужно взглянуть на самую последнюю запись max (уникальное поле).эта таблица имеет поле даты.если это поле не равно нулю, функция должна вернуть ложные значения первого условия.

Вот что у меня есть.Когда я компилирую, я получаю две ошибки:

Статут SQL игнорируется - в первой строке первого выбранного статута

и

Ошибка(17,45): PL / SQL: ORA-00942: таблица или представление не существует - на подвыборе первого выбора

create or replace FUNCTION "F_STATUS" (
N_UNIQUE IN NUMBER)
RETURN VARCHAR2
IS
  V_TORF varchar2(20);
  D_ACTDATE date;
  D_STARTDATE date;
BEGIN
select b.startdate into D_STARTDATE
from customerdb.customer a, customerdb.customer_detail b
where a.uniquefield= b.uniquefield(+) and
b.uniquefield = N_UNIQUE and
b.uniquefield in 
  (select max(c.uniquefield) from customerdb.customer_detail c group by uniquefield);

if 
D_STARTDATE is not null
then
  V_TORF :='FALSE';
  RETURN(V_TORF);
else
  select expiredate into D_ACTDATE
  from customerdb.customer 
  where customerdb.customer.uniquefield = N_UNIQUE;
  IF 
      D_ACTDATE > SYSDATE 
      then
      V_TORF :='TRUE';
      RETURN(V_TORF);
   else
      v_TORF :='FALSE';
      RETURN(V_TORF);
   end if;
 end if;
end;

1 Ответ

4 голосов
/ 22 ноября 2011

Ваша процедура не может видеть таблицу customerdb.customer_detail. Вероятно, это связано с тем, что процедуры определены без какой-либо роли, и у вас, вероятно, есть роль с привилегией SELECT ANY TABLE. Из руководства по безопасности :

Пользователь, которому принадлежит процедура, также должен иметь привилегии для объектов схемы, указанных в теле процедуры. Для создания процедуры вам должны быть явно предоставлены необходимые привилегии (система или объект) для всех объектов, на которые ссылается процедура . Вы не можете получить необходимые привилегии через роли. Это включает привилегию EXECUTE для любых процедур, которые вызываются внутри создаваемой процедуры.

Чтобы узнать, сможет ли ваша процедура выполнить запрос, вы можете проверить с вашим пользователем, отключив все роли , с помощью следующей команды :

set role none

В вашем случае вам, вероятно, нужно предоставить привилегию SELECT непосредственно вашему пользователю:

GRANT SELECT ON customerdb.customer_detail TO <your_user>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...