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