CftClub.ru
Клуб специалистов ЦФТ-Банк

ORA-00904 - достаточно странненько вылетает.

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Oracle DBA
Предыдущая тема :: Следующая тема  
Автор Сообщение
Damir
Участник - экстремал
Неподтвержденный


Вступление в Клуб: 29.03.2013
СообщениеПт Окт 18, 2013 10:10   ORA-00904 - достаточно странненько вылетает. Ответить с цитатой
Полезность: Нет оценки
Проблему я у себя объехал.
Но осадочек остался.
Скорее всего, это оракловый глюк - пока ковырять нет времени.

Как воспроизвести глюк....
Представление, поле - переход по условию (не по ссылке и не по обратной ссылке - именно по условию).
В условии перехода - в фильтре используем функцию pl\sql (кстати, она даже deterministic)
Глюк объехал так - создал поле в представлении - значение поля - вызов pl\sql-функции, а в условии перехода использовал это поле (вместо функции).
Уфф.... сумбурно получилось. Ну... кого достанет "ORA-00904 " - тот разберется.

Первоначальный запрос с глюком:

Код:

ORA-00904: "Z$AC_FIN_SET_SERVICE_GRP"."GET_SERVICE_GROUP_CODE": недопустимый идентификатор
SELECT ID, CLASS_ID, STATE_ID, C_1, C_2, C_3, REF3, C_4, REF4, C_5, REF5, TO_CHAR(C_6) C_6, C_7, C_8, REF8, C_9, C_10, REF10, C_11, REF11, C_12, REF12, C_13, TO_CHAR(C_14) C_14, TO_CHAR(C_15) C_15, REF15, C_16, REF16, C_17, REF17, TO_CHAR(C_18) C_18, REF18, C_19, C_20, REF20, C_21, REF21, C_22, REF22, C_23, REF23, C_24, REF24, C_25, TO_CHAR(C_26) C_26, REF26, C_27, REF27, C_28, REF28, U_1, U_2, C_29, TO_CHAR(C_30) C_30, C_31, REF31 FROM $$$.VW_CRIT_2906041675 WHERE ( REF4 = ? and  REF5 in (select sg.service from comp.vw_rpt_service_group sg where sg.code = /*[C_SERVICE_GROUP_CODE]*/ Z$AC_FIN_SET_SERVICE_GRP.GET_SERVICE_GROUP_CODE()    )) AND (ROWNUM <= ?) ORDER BY C_2 DESC, C_13 DESC


Объехал глюк - вместо Z$AC_FIN_SET_SERVICE_GRP.GET_SERVICE_GROUP_CODE() вставил поле
- отрабатывает без ошибок

Код:

SELECT ID, CLASS_ID, STATE_ID, C_1, C_2, C_3, REF3, C_4, REF4, C_5, REF5, TO_CHAR(C_6) C_6, C_7, C_8, REF8, C_9, C_10, REF10, C_11, REF11, C_12, REF12, C_13, TO_CHAR(C_14) C_14, TO_CHAR(C_15) C_15, REF15, C_16, REF16, C_17, REF17, TO_CHAR(C_18) C_18, REF18, C_19, C_20, REF20, C_21, REF21, C_22, REF22, C_23, REF23, C_24, REF24, C_25, TO_CHAR(C_26) C_26, REF26, C_27, REF27, C_28, REF28, U_1, U_2, C_29, TO_CHAR(C_30) C_30, C_31, REF31 FROM $$$.VW_CRIT_2906041675 WHERE ( REF4 = ? and  REF5 in (select sg.service from comp.vw_rpt_service_group sg where sg.code = ? /* Z$AC_FIN_SET_SERVICE_GRP.GET_SERVICE_GROUP_CODE()  */  )) AND (ROWNUM <= ?) ORDER BY C_2 DESC, C_13 DESC

Параметры:
ClassID = MAIN_DOCUM
P1 = '7545515588'
P2 = 'RECEIPT_06'
P3 = 200


На всякий случай - исходное представление с вычисляемым полем - вызовом функции:

Код:

SELECT
A1_1.Id ID,
case when

  grouping_id(A1_1.C_PERSONAL_ACC, A6_1.C_OPDATE, A1_1.ID)=0

then max(A2_1.C_SHORT_NAME) end C_1,
A6_1.C_OPDATE C_2,
sum(-A6_1.C_SALDO) C_3,
sum(

-(NVL(A6_1.C_CHARGE ,0) +(-nvl((select to_number(d.c_val) from z#datasets d,z#attributes attr where A6_1.C_ADDINF = d.collection_id and d.c_attribute=attr.id and attr.c_code='PRIVILEGE'),0)))

) C_4,
sum(

-(NVL(A6_1.C_CHARGE ,0) +(-nvl((select to_number(d.c_val) from z#datasets d,z#attributes attr where A6_1.C_ADDINF = d.collection_id and d.c_attribute=attr.id and attr.c_code='PRIVILEGE'),0)))

) C_5,
sum(-A6_1.C_MAKET) C_6,
sum(-A6_1.C_REPAYS) C_7,
sum(-A6_1.C_PAYS) C_8,
sum(-(nvl(A6_1.C_SALDO,0)+nvl(A6_1.C_CT,0)+nvl(A6_1.C_DT,0))) C_9,
'--->' C_10,
'' C_11,
A1_1.C_PERSONAL_ACC U_1,
max(A2_1.Id) U_2,
max(A5_1.C_DELIVER) U_3,
sum(-A6_1.C_CHARGE*0) U_4,
sum(-A6_1.C_CHARGE) U_5,
sum(-A6_1.C_CHARGE*0) U_6,
sum(-A6_1.C_SUBSIDY) U_7,
sum(-A6_1.C_SUBSIDY+(-A6_1.C_CHARGE)) U_8,
max((select min(ord) from vw_rpt_service_group sg where sg.code = 'RECEIPT' and sg.service = a2_1.id)) U_9,
grouping_id(A1_1.C_PERSONAL_ACC, A6_1.C_OPDATE, A1_1.ID) U_10,
max(

(select Z$AC_FIN_SET_SERVICE_GRP.GET_SERVICE_GROUP_CODE() from dual)

) U_11
 FROM Z#AC_FIN A1_1,
 Z#FT_MONEY A2_1,
 Z#PL_USV A5_1,
 Z#ACCARC A6_1
 WHERE A1_1.C_FINTOOL = A2_1.ID
 AND A1_1.C_MAIN_USV = A5_1.ID(+)
 AND A1_1.C_ARC = A6_1.COLLECTION_ID(+)
 AND (/*a5_1.c_num = '50101'

and z$branch_utl.showAccCompany(a5_1.c_deliver) = 1

and A1_1.C_STATUS<>3*/0=0

AND Z$BRANCH_UTL.isServiceAccess(A1_1.C_FINTOOL) > 0



and  A2_1.Id -- услуга

   in (select sg.service from comp.vw_rpt_service_group sg where sg.code = Z$AC_FIN_SET_SERVICE_GRP.GET_SERVICE_GROUP_CODE() )

   

   )
 AND
  ( SYS_CONTEXT('COMP_SYSTEM','ADMIN')='1' OR
    SYS_CONTEXT('COMP_RIGHTS','17064249116')='1'
    AND
    ( SYS_CONTEXT('COMP_RIGHTS','AC_FIN')='1'
    )
  )

 AND SYS_CONTEXT('COMP_OPTIONS','17064249116') is null
 AND SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') is null
group by rollup (A1_1.C_PERSONAL_ACC, A6_1.C_OPDATE, A1_1.ID)

having grouping_id(A1_1.C_PERSONAL_ACC, A6_1.C_OPDATE, A1_1.ID) in (0, 1)
[/code]
devor
Профи
Неподтвержденный


Вступление в Клуб: 13.02.2012
СообщениеПт Окт 18, 2013 10:46    Ответить с цитатой
Полезность: Нет оценки
Как я понимаю, под IBS работает, а под другими пользователями нет?
Нужны гранты для пользователя, тут же явный вызов функции идет.
Damir
Участник - экстремал
Неподтвержденный


Вступление в Клуб: 29.03.2013
СообщениеПт Окт 18, 2013 11:03    Ответить с цитатой
Полезность: Нет оценки
devor пишет:
Как я понимаю, под IBS работает, а под другими пользователями нет?
Нужны гранты для пользователя, тут же явный вызов функции идет.

Да, похоже с правами что-то не так.
Но я не могу пока понять - что не так.
Из-под владельца схемы работает (из TOAD например) - из-под Навигатора вылетает.
Сейчас вот уткнулся в подобную ошибку.
У пользователя есть права на справочник (на представление некоего справочника) - проверил, открывает нормально.
При попытке использовать эту вьюшку справочника в других представлениях в условном переходе (получается, в sql-запросе навигатора - не во вью Оракла - в секции where) - ловлю ошибку, "Таблица не существует".

Оригинальный запрос ниже (с ошибкой) - из-под Навигатора:

Код:
ORA-00942: таблица или представление пользователя не существует
SELECT ID, CLASS_ID, STATE_ID, C_1, C_2, C_3, REF3, C_4, REF4, C_5, REF5, TO_CHAR(C_6) C_6, C_7, C_8, REF8, C_9, C_10, REF10, C_11, REF11, C_12, REF12, C_13, TO_CHAR(C_14) C_14, TO_CHAR(C_15) C_15, REF15, C_16, REF16, C_17, REF17, TO_CHAR(C_18) C_18, REF18, C_19, C_20, REF20, C_21, REF21, C_22, REF22, C_23, REF23, C_24, REF24, C_25, TO_CHAR(C_26) C_26, REF26, C_27, REF27, C_28, REF28, U_1, U_2, U_3, C_29, TO_CHAR(C_30) C_30, C_31, REF31 FROM $$$.VW_CRIT_2906041675 WHERE ( REF4 = ? and  REF5 in (select sg.service from comp.vw_rpt_service_group sg where sg.code = ? /* Z$AC_FIN_SET_SERVICE_GRP.GET_SERVICE_GROUP_CODE()  */  )  /*and  U_3  in (select ID from Z#SORT_DOCS where C_TYPE_DOCS in ('CHARGE', 'SUBSIDY', 'FINE'))*/ and  U_3  in (select ID from VW_CRIT_2935599 where C_1 in ('CHARGE', 'SUBSIDY', 'FINE'))) AND (ROWNUM <= ?) ORDER BY C_2 DESC, C_13 DESC


Ругается явно на объект VW_CRIT_2935599 - я добавил условие и начало вылетать.
Но из-под этого пользователя прекрасно открывается вьюшка

Код:

SELECT /*+ FIRST_ROWS(1) */ ID, CLASS_ID, C_1, C_2, C_3, C_4, C_5, REF5, C_6, REF6, C_7, REF7, C_8, C_9, C_10 FROM $$$.VW_CRIT_2935599 WHERE (ROWNUM <= ?) ORDER BY C_1, C_2

Параметры:
ClassID = SORT_DOCS
P1 = 200
Alexsey
Эксперт
МЕГА БАНК


Вступление в Клуб: 06.09.2007
СообщениеПт Окт 18, 2013 11:06    Ответить с цитатой
Полезность: Нет оценки
В условиях запрещено использовать таблицы. Только запросы из представлений. Причем представление должно быть CRIT'овым
_________________
всегда есть как минимум 2 выхода
Damir
Участник - экстремал
Неподтвержденный


Вступление в Клуб: 29.03.2013
СообщениеПт Окт 18, 2013 11:49    Ответить с цитатой
Полезность: Нет оценки
devor пишет:
Как я понимаю, под IBS работает, а под другими пользователями нет?
Нужны гранты для пользователя, тут же явный вызов функции идет.

до меня дошло, почему ошибка вылетает.
Я не прописал явно схему.

вмсто VW_CRIT_2935599 надо явно прописывать IBS.VW_CRIT_2935599

Текущую схему можно узнать так:
Код:
select sys_context('USERENV','SESSION_SCHEMA') from dual

текущую схему сменить так:
Код:
alter session set current_schema=schema_name

Обычно смену схемы втыкают в триггер при логировании

Код:
CREATE OR REPLACE TRIGGER "SYSTEM".user_logon
after logon on database
begin
     execute immediate 'alter session set current_schema=schema_name';
end;


У нас такого триггера нет, все пользователи работают каждый под своей схемой.
Народ, а у вас как устроено - пользователи под какой схемой работают?
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Oracle DBA Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru