ORA-00904 - достаточно странненько вылетает.
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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; |
У нас такого триггера нет, все пользователи работают каждый под своей схемой.
Народ, а у вас как устроено - пользователи под какой схемой работают? |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|