Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Solaris: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

приколитесь !

вот этот скрипт работает без ошибок:
declare
	a int;
begin
	-- assume that id and parent cant be null

	select count(*)
		into a
		from
			(select id, parent
				from (
					select 1 as id, 0 as parent from dual
					union all select 2, 1 from dual) some_tree
				connect by prior id = parent
				start with id = 1) left
			full join
			(select id, parent
				from (
					select 1 as id, 0 as parent from dual
					union all select 2, 1 from dual
					union all select 3, 2 from dual) some_other_tree
				connect by prior id = parent
				start with id = 1) right
			on right.id = left.id
				and right.parent = left.parent
		where (left.id is null
			or right.id is null
			or left.parent is null
			or right.parent is null)
			and rownum = 1;

	dbms_output.put_line('trees are ' || case when a != 0 then 'not ' end || 'same');
end;

а этот выдает ошибку ORA-00920: неверен реляционный оператор
declare
	a int;
	b int := 1;
begin
	-- assume that id and parent cant be null

	select count(*)
		into a
		from
			(select id, parent
				from (
					select 1 as id, 0 as parent from dual
					union all select 2, 1 from dual) some_tree
				connect by prior id = parent
				start with id = b) left
			full join
			(select id, parent
				from (
					select 1 as id, 0 as parent from dual
					union all select 2, 1 from dual
					union all select 3, 2 from dual) some_other_tree
				connect by prior id = parent
				start with id = b) right
			on right.id = left.id
				and right.parent = left.parent
		where (left.id is null
			or right.id is null
			or left.parent is null
			or right.parent is null)
			and rownum = 1;

	dbms_output.put_line('trees are ' || case when a != 0 then 'not ' end || 'same');
end;

найтите 10 отличий :)
21 июн 07, 14:54    [4299593]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
select banner from v$version where rownum = 1

Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - Prod
Полет нормальный.
21 июн 07, 14:59    [4299618]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
блин, я че, зря пач накатил ?
21 июн 07, 15:00    [4299628]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
А на что именно он ругается?Пробовали локализовать проблему?
21 июн 07, 15:01    [4299638]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
MazoHist
Guest
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE	10.2.0.1.0	Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Solaris: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

Никаких проблем не обнаружено. Дома посмотрю на 10.2.0.2 под Linux.
21 июн 07, 15:02    [4299639]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
проблема в сочетании фулл джоина с коннект баем, сцуко
21 июн 07, 15:02    [4299648]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
when_others
Member

Откуда:
Сообщений: 1705
--Eugene--

а этот выдает ошибку ORA-00920: неверен реляционный оператор

найтите 10 отличий :)


у меня оба отработали без ошибок
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bi
21 июн 07, 15:05    [4299665]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
ну блин
значит или лыжи не едут или одно из двух
21 июн 07, 15:10    [4299694]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
ГостЪ
Guest
мне кажется ему
left full join
не нравится
21 июн 07, 15:35    [4299880]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
ГостЪ
мне кажется ему
left full join
не нравится


"Что-то мне Чингачгук в последнее время не нравится"
"Хм-м-м... Ну не нравится - не ешь"
(С)
21 июн 07, 15:42    [4299926]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
поле автор
Guest
--Eugene--
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Solaris: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production



да... 10.2.0.3 выдает ошибку
21 июн 07, 15:47    [4299960]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
сразу на душе стало лехче
я думал уже шиза пошла
21 июн 07, 15:57    [4300036]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
--Eugene--
сразу на душе стало лехче
я думал уже шиза пошла


А если все таки left / right заменить на другие имена - тоже не работает?
21 июн 07, 16:01    [4300069]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
tru55
А если все таки left / right заменить на другие имена
на full например...
21 июн 07, 16:10    [4300159]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
гмм. а какой физический смысл имеет
left full join ???
21 июн 07, 16:17    [4300203]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Gluk (Kazan)
гмм. а какой физический смысл имеет
left full join ???


На самом деле подразумевается, что left - имя inline view, но лично я всегда избегал использовать зарезервированные слова для подобных целей :)
21 июн 07, 16:20    [4300238]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
--Eugene--
сразу на душе стало лехче
я думал уже шиза пошла

10.2.0.1 - нет ошибки
Вообще, грустно..
21 июн 07, 16:21    [4300249]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
2 --Eugene--
попробуйте квалифицировать переменную
напр.
begin
<<bb>>
declare
	a int;
	b int := 1;
begin
	-- assume that id and parent cant be null
	select count(*)
		into a
		from
			(select id, parent
				from (
					select 1 as id, 0 as parent from dual
					union all select 2, 1 from dual) some_tree
				connect by prior id = parent
				start with id = bb.b) left
			full join
			(select id, parent
				from (
					select 1 as id, 0 as parent from dual
					union all select 2, 1 from dual
					union all select 3, 2 from dual) some_other_tree
				connect by prior id = parent
				start with id = bb.b) right
			on right.id = left.id
				and right.parent = left.parent
		where (left.id is null
			or right.id is null
			or left.parent is null
			or right.parent is null)
			and rownum = 1;

	dbms_output.put_line('trees are ' || case when a != 0 then 'not ' end || 'same');
end;
end;
21 июн 07, 16:35    [4300322]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10050
orawish
2 --Eugene--
попробуйте квалифицировать переменную


SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

SQL> begin
  2  <<bb>>
  3  declare
  4   a int;
  5   b int := 1;
  6  begin
  7   -- assume that id and parent cant be null
  8   select count(*)
  9    into a
 10    from
 11     (select id, parent
 12      from (
 13       select 1 as id, 0 as parent from dual
 14       union all select 2, 1 from dual) some_tree
 15      connect by prior id = parent
 16      start with id = bb.b) left
 17     full join
 18     (select id, parent
 19      from (
 20       select 1 as id, 0 as parent from dual
 21       union all select 2, 1 from dual
 22       union all select 3, 2 from dual) some_other_tree
 23      connect by prior id = parent
 24      start with id = bb.b) right
 25     on right.id = left.id
 26      and right.parent = left.parent
 27    where (left.id is null
 28     or right.id is null
 29     or left.parent is null
 30     or right.parent is null)
 31     and rownum = 1;
 32  
 33   dbms_output.put_line('trees are ' || case when a != 0 then 'not ' end || 'same');
 34  end;
 35  end;
 36  /
begin
*
ERROR at line 1:
ORA-00920: invalid relational operator
ORA-06512: at line 8


SQL> 

It looks like a bug with ANSI join + PL/SQL bind variables. Changing one or the other works (at least on 10.2.0.3).

SY.

Сообщение было отредактировано: 21 июн 07, 17:15
21 июн 07, 17:14    [4300553]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
i told you
that's a bug :)

что интересно, изначально я писал этот селект без использования dual. - в том случае ораклу сносило крышу в двух направлениях в зависимости от написания "id = b" или "b = id".
в одном случае он говорил, что не хватает слова BY, а в другом - что не хватает закрывающей скобки :)
21 июн 07, 18:11    [4300917]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
RA\/EN
Member

Откуда:
Сообщений: 3659
Обойти можно так:
declare
	a int;
	b INT := 1;
begin
	-- assume that id and parent cant be null
  WITH LEFT AS
			(select id, parent
				from (
					select 1 as id, 0 as parent from dual
					union all select 2, 1 from dual) some_tree
				connect by prior id = parent
				start with id = b),
        RIGHT AS (select id, parent
				from (
					select 1 as id, 0 as parent from dual
					union all select 2, 1 from dual
					union all select 3, 2 from dual) some_other_tree
				connect by prior id = parent
				start with id = b)
	select count(*)
		into a
		FROM LEFT
			FULL JOIN
       right
			on right.id = LEFT.id
				and right.parent = LEFT.parent
		where (LEFT.id is null
			or right.id is null
			or LEFT.parent is null
			or right.parent is null)
			and rownum = 1;

	dbms_output.put_line('trees are ' || case when a != 0 then 'not ' end || 'same');
end;
21 июн 07, 19:35    [4301218]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
ГостЪ
Guest
tru55
Gluk (Kazan)
гмм. а какой физический смысл имеет
left full join ???


На самом деле подразумевается, что left - имя inline view, но лично я всегда избегал использовать зарезервированные слова для подобных целей :)


select *
from
(select level i2 from dual connect by level <3) left /* lt*/  join (select 1 i1 from dual)  right
on(i1 = i2)

руки отрывать таким, да?
:)
22 июн 07, 12:43    [4303617]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
RA\/EN
Member

Откуда:
Сообщений: 3659
ГостЪ
tru55

На самом деле подразумевается, что left - имя inline view, но лично я всегда избегал использовать зарезервированные слова для подобных целей :)

руки отрывать таким, да?
:)

Как не трудно проверить, от замены LEFT на другой алиас ситуация не меняется
22 июн 07, 14:00    [4304248]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
RA\/EN
ГостЪ
tru55

На самом деле подразумевается, что left - имя inline view, но лично я всегда избегал использовать зарезервированные слова для подобных целей :)

руки отрывать таким, да?
:)

Как не трудно проверить, от замены LEFT на другой алиас ситуация не меняется


Ага, не трудно конечно. Время и место только для установки 10-ки найти.
А так - совсем не трудно
22 июн 07, 14:03    [4304279]     Ответить | Цитировать Сообщить модератору
 Re: ЛЮДИ ! Я НАШЕЛ КОСЯК В 10g !  [new]
ГостЪ
Guest
RA\/EN

Как не трудно проверить, от замены LEFT на другой алиас ситуация не меняется


ну так проверь.

 
SQL> select * from v$version
  2  ;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

SQL> select *
  2  from
  3  (select level i2 from dual connect by level <3) left /* lt*/  join (select 1 i1 from dual)  right
  4  on(i1 = i2);

        I2         I1
---------- ----------
         1          1
         2

SQL> select *
  2  from
  3  (select level i2 from dual connect by level <3)  lt  join (select 1 i1 from dual)  right
  4  on(i1 = i2);

        I2         I1
---------- ----------
         1          1
22 июн 07, 14:44    [4304545]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить