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. В том числе много улучшений парсера запросов.

Другие вопросы по тегам