Sybase DataContext: префикс столбца не совпадает с именем таблицы или псевдонимом
Мы имеем дело с базой данных Sybase в основном коде Java. Мы используем org.eobjects.metamodel.DataContext
разобрать запрос.
String sCol[]=table.getColumnNames();
Query query=dataContext.query().from(table.getName()).select(sCol).toQuery();
return new QueryIterator(dataContext.executeQuery(query).iterator());
Но это исполняющий запрос. Тот же код работает нормально с базой данных Oracle для анализа и выполнения запроса.
Некоторые из сгенерированных примеров запроса:
- выберите City.CityName от имени владельца. City
- выберите City.CityName из City
- выберите CityName от имени владельца. Город
- выберите CityName из City
- выберите имя владельца. Город. Город. Имя. Имя владельца. Город.
- ВЫБЕРИТЕ "Город". "CityName" ОТ ФИО владельца. "Город"
- выберите * от имени владельца. Город
Ни один из вышеуказанных запросов не выполнен. Мы получаем эти ошибки:
- Невозможно проанализировать ИЗ токена: "имя владельца". "Город"
- Не удалось выполнить запрос: префикс столбца "Город" не совпадает с именем таблицы или псевдонимом, используемым в запросе. Либо таблица не указана в предложении FROM, либо имеет корреляционное имя, которое должно использоваться вместо этого.
- Невозможно проанализировать токен SELECT: ownername.City.CityName
Как мы можем выполнить запрос, используя метамодель с базой данных SYBASE ИЛИ Есть ли другой способ выполнить запросы Sybase?
2 ответа
Oracle (и Microsoft) используют логическую конструкцию схемы, а Sybase ASE - нет. В SAP/Sybase ASE все таблицы и столбцы в базе данных находятся в одной схеме. Тем не менее, пользователи могут иметь свои собственные объекты в базе данных, поэтому существует возможность имитировать некоторые схемы поведения, используя владение пользователями, но это потребует дополнительных усилий.
Для Sybase правильный синтаксис запроса будет:
SELECT [ Col1, Col2 | * ]
FROM [dbName].[ownerName.]TABLE
В твоем случае
SELECT CityName
FROM dbName.ownername.City
В Sybase ASE обычно рекомендуется, чтобы все объекты принадлежали 'dbo', поэтому в этом случае вы можете опустить владельца в запросе:
SELECT CityName
FROM dbName..City
Полный синтаксис и информацию о запросах можно найти в разделе " Запрос" Руководства пользователя Transact SQL в документации.
Получаемые вами сообщения об ошибках поступают со слоя синтаксического анализатора запросов MetaModel. Он ищет совпадающие имена столбцов и таблиц в метаданных вашей базы данных еще до того, как запустит запрос.
Я заметил, что вы используете пространство имен "org.eobjects.metamodel". Вам следует обновить Apache MetaModel ("org.apache.metamodel"), если это возможно, так как многое было улучшено в MetaModel с момента его введения в Apache. В том числе много улучшений парсера запросов.