![]() |
|
Модераторы: LSD |
![]()
|
|
| setnull |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 3.7.2007 Репутация: 1 Всего: 1 |
Все здрваствуйте.
такая тема:
Только, если записей болльше 3х, все равно вылетает ORA-06532: Subscript outside of limit. Он че просчитует THEN даже если WHEN не проходит????????? И еще. Как узнать длинну массива? an_array.length или как? Чтоб не жестко 3 прописывать? Спасибо!!!!!!!!! |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 23 Всего: 44 |
||||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
По всему видать ROWNUM рассчитывается ПОСЛЕ формирования строки фетча. На 9.2.0.8 - тоже самое Объяснить пока не могу, надо медитировть, но, полагаю, это фича а не баг -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
Результат медитации (сугубо мое ИМХО) таков:
an_array из pl_sql машины передается в sql машину связанной переменной. значения связанных переменных вычисляются до выполнения запроса. Т.е. на том этапе, когда rownum еще и в проекте нет. Почему я сделал такой вывод Смотрим скрипт:
Как мы видим, первый запрос был разобран и pl/sql массив был ему передан в качестве бинда как значение, а не как массив Второй запрос даже не был разобран. Т.е. ошибка произошла на этапе разбора - до выполнения запроса.. Следовательно функцию foo вызвал pl/sql движок а не SQL. Отчего он не руганулся на rownum - мне не понятно. ЗЫ спасибо за интересный пример. Это сообщение отредактировал(а) Zloxa - 10.2.2009, 14:00 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 23 Всего: 44 |
причина в том что rownum это псевдо столбуц который формируется после from и where по этому на момент выполнения sql значение для параметра :Var1 запроса - "select case when (rownum <= :Var2) then :Var1 else null end test_field from dual" нет. именно в :Var1 преобразуется an_array(rownum). в этом можно убедиться изучив результат запроса:
|
|||
|
||||
![]()
|
| Правила форума "Oracle" | |
|
|
Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Oracle | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |