|
Прошу помочь с курсором
|
|||
---|---|---|---|
#18+
Господа Ораклисты, помогите плиз, 3 битых часа мучался над объявлением курсора, а так и ничего не достиг: объявляю курсор: CURSOR GetSome IS SELECT * FROM (SELECT empno FROM emp ORDER BY empno) WHERE ROWNUM < 11; --(простейший пример из Оракловского хелпа) Собака парсер пишет: PLS-00103: Encountered the symbol "ORDER" when expecting one of the following: ) * & - + / mod rem with an exponent (**) and or group having intersect minus start union where connect || The symbol "group was inserted before "ORDER" to continue. И так я это объявление крутил, и эдак, ну ни в какую. Всегда спотыкакется на ORDER. Убираю ORDER - ошибки нет. Но ORDER там необходим. Просто вызвав этот запрос из любой Оракловсой программы (будь то SQL+ или SQL Navigator (Quest Software)) запрос отрабатываеться без ошибок. Поместив его в динамический вызов OPEN GetFSSites FOR 'SELECT * FROM (SELECT empno FROM emp ORDER BY empno) WHERE ROWNUM < 11' все тоже прекрасно работает. Так в чем же все таки проблема???? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2001, 10:34 |
|
Прошу помочь с курсором
|
|||
---|---|---|---|
#18+
IMHO проблемма в том, что сортировка должна выполняться над результирующем набором записей. Если тебе надо упроядочить записи в динамической таблице, то придумай другоцй способ. Но подумай о производительности. Ведь ты просматриваешь всю таблицу, чтобы извлечь десять записей... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2001, 12:35 |
|
Прошу помочь с курсором
|
|||
---|---|---|---|
#18+
В подзапросах (так же как и во view) order by применять нельзя. Да и смысла в этом мало. Кстати, почему Order вам тут так необходим? Почему нельзя написать так: CURSOR GetSome IS SELECT empno FROM emp WHERE ROWNUM < 11 ORDER BY empno ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2001, 03:36 |
|
Прошу помочь с курсором
|
|||
---|---|---|---|
#18+
to: ThyNibelungenhord Хотя, sorry, не посмотрел, теперь увидел смысл в вашем курсоре. Мало того Oracle 8.1.7SE отработал ваш пример...И View c Order by создалось!!! В 7.3.4 это всё не прокатывало... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2001, 03:51 |
|
Прошу помочь с курсором
|
|||
---|---|---|---|
#18+
Сразу оговорюсь, что ОРАКЛ имеет одну замечательную штуку и называеться она Explain plan 1. Очевидно, что результваты запросов SELECT empno FROM emp WHERE ROWNUM < 11 ORDER BY empno и SELECT * FROM (SELECT empno FROM emp ORDER BY empno) WHERE ROWNUM < 11 - совершенно не эдентичты. Потому, что в первом случае беруться первые записи сверху неотсортированного множеста. Во втором - отсортированного. А это, увы, не одно и то же. Насчет того, что чтобы взять первые 10 записей -- ОРАКЛ сначала сортирует внутренний курсор, а потом только берет сверху 10 - ЭТО НЕ ТАК. Глядя на замечательный Explain plan вижу, что ОРАКЛ сортирует записи запроса с учетом Stop Key - который в данном случае равнозначен условию WHERE ROWNUM < 11. То есть явно стараеться скорее создать выборку первых 10 отсортированных записей. Исходя из этого видим что, чем больше ROWNUM, тем запрос будет отрабатываться медленнее. 2. >> Если тебе надо упроядочить записи в динамической таблице, то придумай другой способ Прошу подсказать или хотябы намекнуть о таком способе. 3. >> Мало того Oracle 8.1.7SE отработал ваш пример...И View c Order by создалось!!! В 7.3.4 это всё не прокатывало... Я использую Oracle 8.1.5.0.0 - и там это объявление курсора к сожелению не работает!!! Говорила мама - ставь Oracle 8.1.7 4. Но все равно остаеться непонятным, почему нельзя явно задикларировать такой курсор, в то время как он спокойно может отработаться будучи отправленным через SQL+????? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2001, 07:06 |
|
Прошу помочь с курсором
|
|||
---|---|---|---|
#18+
to: ThyNibelungenhord то, что это не одно и то же это я уже понял. Но!!! Если по emp_no есть индекс то можно заставить оракл сканировать табличку в нужном порядке с помощью хинтов INDEX_ASC или INDEX_DESC. В этом случае вы получите желаемый результат без сортировки в подзапросе. Вот так: SELECT /*+ INDEX_ASC(EMP PK_EMP) */ empno FROM scott.emp WHERE ROWNUM < 11 А по поводу 8.1.5 и 8.1.7...IMHO после выхода Oracle 9 - самое время ставить 8.1.7 и работать на нём. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2001, 07:50 |
|
|
start [/forum/topic.php?fid=52&msg=32011171&tid=1993564]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
39ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 171ms |
0 / 0 |