Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Oracle

cursor_sharing и ORA-00979: выражение не является выражением GROUP BY : Oracle

28.03.2024 13:18


31.10.2007 11:31
Pyatak
 
Цитата:
OlegON Думаю правильнее будет завести в оракловом разделе тему с указанием запроса. Ругается Оракл, а не оптимайзер. Что-то с литералами напутал.
Собственно, вот, отдельная тема.

Итак, имеем простой запрос:
Код:
SELECT dc.article as "Артикул",
       c.name as "Наименование"
  FROM supermag.smdocuments d,
       supermag.smspec dc,
       supermag.smcard c
 WHERE d.doctype=dc.doctype
   AND d.id=dc.docid
   AND c.article=dc.article
   AND c.accepted = 1
   AND d.doctype='WI'
   AND d.docstate>1
   AND TO_DATE(d.createdat) BETWEEN ('%DATE1%') AND ('%DATE2%')
   AND d.clientindex = (%VEN%)
GROUP BY dc.article, c.name
ORDER BY c.name
при cursor_sharing=exac, всё ОК!

при cursor_sharing=similar, как рекомендует оптимайзер, выдается ошибка ORA-00979: выражение не является выражением GROUP BY

???

на что этот параметр влияет и почему такой эффект?
31.10.2007 11:59
reddevil
 
select * from v$version;

Чего говорит?
31.10.2007 12:25
Pyatak
 
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
PL/SQL Release 9.2.0.7.0 - Production
CORE 9.2.0.7.0 Production
TNS for 32-bit Windows: Version 9.2.0.7.0 - Production
NLSRTL Version 9.2.0.7.0 - Production
31.10.2007 13:03
reddevil
 
не обратил внимание сразу - '%DATE1% Что это за среда такая у которой так переменные оформляются?
31.10.2007 16:53
Pyatak
 
Репортер собственного производства
01.11.2007 06:44
reddevil
 
Цитата:
Pyatak Репортер собственного производства
Ну тогда отладчик в руки и вперед, ибо:

Код:
Connected to Oracle9i Enterprise Edition Release 9.2.0.7.0 
Connected as supermag

SQL> 
SQL> define date1='10.10.2007'
SQL> define date2='10.10.2007'
SQL> define ven=181
SQL> alter session set cursor_sharing=EXACT;

Session altered

SQL> SELECT dc.article as "Артикул",
  2         c.name as "Наименование"
  3    FROM supermag.smdocuments d,
  4         supermag.smspec dc,
  5         supermag.smcard c
  6   WHERE d.doctype=dc.doctype
  7     AND d.id=dc.docid
  8     AND c.article=dc.article
  9     AND c.accepted = 1
 10     AND d.doctype='WI'
 11     AND d.docstate>1
 12     AND TO_DATE(d.createdat) BETWEEN ('&DATE1') AND ('&DATE2')
 13     AND d.clientindex = (&VEN)
 14  GROUP BY dc.article, c.name
 15  ORDER BY c.name
 16  /

Артикул                                            Наименование                                                                    
-------------------------------------------------- --------------------------------------------------------------------------------
                                      


32 rows selected

SQL> alter session set cursor_sharing=SIMILAR;

Session altered

SQL> SELECT dc.article as "Артикул",
  2         c.name as "Наименование"
  3    FROM supermag.smdocuments d,
  4         supermag.smspec dc,
  5         supermag.smcard c
  6   WHERE d.doctype=dc.doctype
  7     AND d.id=dc.docid
  8     AND c.article=dc.article
  9     AND c.accepted = 1
 10     AND d.doctype='WI'
 11     AND d.docstate>1
 12     AND TO_DATE(d.createdat) BETWEEN ('&DATE1') AND ('&DATE2')
 13     AND d.clientindex = (&VEN)
 14  GROUP BY dc.article, c.name
 15  ORDER BY c.name
 16  /

Артикул                                            Наименование                                                                    
-------------------------------------------------- --------------------------------------------------------------------------------

32 rows selected

SQL> alter session set cursor_sharing=FORCE;

Session altered

SQL> SELECT dc.article as "Артикул",
  2         c.name as "Наименование"
  3    FROM supermag.smdocuments d,
  4         supermag.smspec dc,
  5         supermag.smcard c
  6   WHERE d.doctype=dc.doctype
  7     AND d.id=dc.docid
  8     AND c.article=dc.article
  9     AND c.accepted = 1
 10     AND d.doctype='WI'
 11     AND d.docstate>1
 12     AND TO_DATE(d.createdat) BETWEEN ('&DATE1') AND ('&DATE2')
 13     AND d.clientindex = (&VEN)
 14  GROUP BY dc.article, c.name
 15  ORDER BY c.name
 16  /

Артикул                                            Наименование                                                                    
-------------------------------------------------- --------------------------------------------------------------------------------


32 rows selected

SQL>
И оффтоп но:
1. AND TO_DATE(d.createdat) BETWEEN ('%DATE1%') AND ('%DATE2%')
я бы подумал над этой строчкой !
2. Зачем group by, distinct был бы если бы возможно быстрей, но даже если и нет то хотя бы логика не страдала.
Часовой пояс GMT +3, время: 13:18.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.