powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Прошу помочь с курсором
6 сообщений из 6, страница 1 из 1
Прошу помочь с курсором
    #32011171
ThyNibelungenhord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа Ораклисты, помогите плиз, 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' все тоже прекрасно работает.

Так в чем же все таки проблема????
...
Рейтинг: 0 / 0
Прошу помочь с курсором
    #32011183
iperezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IMHO проблемма в том, что сортировка должна выполняться над результирующем набором записей. Если тебе надо упроядочить записи в динамической таблице, то придумай другоцй способ. Но подумай о производительности. Ведь ты просматриваешь всю таблицу, чтобы извлечь десять записей...
...
Рейтинг: 0 / 0
Прошу помочь с курсором
    #32011240
alvako
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В подзапросах (так же как и во view) order by применять нельзя. Да и смысла в этом мало.
Кстати, почему Order вам тут так необходим?
Почему нельзя написать так:
CURSOR GetSome IS SELECT empno FROM emp WHERE ROWNUM < 11 ORDER BY empno
???
...
Рейтинг: 0 / 0
Прошу помочь с курсором
    #32011241
alvako
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to: ThyNibelungenhord
Хотя, sorry, не посмотрел, теперь увидел смысл в вашем курсоре. Мало того Oracle 8.1.7SE отработал ваш пример...И View c Order by создалось!!! В 7.3.4 это всё не прокатывало...
...
Рейтинг: 0 / 0
Прошу помочь с курсором
    #32011255
ThyNibelungenhord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сразу оговорюсь, что ОРАКЛ имеет одну замечательную штуку и называеться она 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+?????
...
Рейтинг: 0 / 0
Прошу помочь с курсором
    #32011258
alvako
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 и работать на нём.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Прошу помочь с курсором
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]