Ошибка SQL-запроса с ODBC-соединением в R с использованием драйвера Informix - PullRequest
1 голос
/ 18 мая 2011

Благодаря функциональности из пакета RODBC я успешно создал ODBC, но получаю сообщения об ошибках при попытке запросить базу данных. Я использую 32-разрядный драйвер INFORMIX 3.31 (версия 3.31.00.10287).

channel <- odbcConnect("exampleDSN")
unclass(channel)
[1] 3
attr(,"connection.string")
[1] "DSN=exampleDSN;UID=user;PWD=****;DB=exampleDB;HOST=exampleHOST;SRVR=exampleSRVR;SERV=exampleSERV;PRO=onsoctcp ... (more parameters)"
attr(,"handle_ptr")
<pointer: 0x0264c098>
attr(,"case")
[1] "nochange"
attr(,"id")
[1] 4182
attr(,"believeNRows")
[1] TRUE
attr(,"colQuote")
[1] "\""
attr(,"tabQuote")
[1] "\""
attr(,"interpretDot")
[1] TRUE
attr(,"encoding")
[1] ""
attr(,"rows_at_time")
[1] 100
attr(,"isMySQL")
[1] FALSE
attr(,"call")
odbcDriverConnect(connection = "DSN=exampleDSN")

Когда я пытаюсь запросить и исследовать структуру возвращаемого объекта, я получаю сообщение об ошибке «chr [1: 2]» 42000 -201 [Informix] [Драйвер ODBC Informix] [Informix] Произошла синтаксическая ошибка. " ...

В частности, я написал выражение для циклического просмотра всех таблиц в базе данных, получения 10 строк и исследования структуры возвращаемого объекта.

for (i in 1:153){res <- sqlFetch(channel, sqlTables(channel, tableType="TABLE")$TABLE_NAME[i], max=10); str(res)}

Каждая итерация возвращает одно и то же сообщение об ошибке. Есть идеи с чего начать?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Когда я возвращаю объект 'res', я получаю следующее -

> res
[1] "42000 -201 [Informix][Informix ODBC Driver][Informix]A syntax error has occurred."
[2] "[RODBC] ERROR: Could not SQLExecDirect 'SELECT * FROM \"exampleTABLE\"'"

Ответы [ 2 ]

2 голосов
/ 19 мая 2011

Цитируемое вами сообщение об ошибке:

"[RODBC] ERROR: Could not SQLExecDirect 'SELECT * FROM \"exampleTABLE\"'"

Informix распознает имена таблиц, заключенные в двойные кавычки, только если в среде установлена ​​среда DELIMIDENT, либо сервера, либо клиента (или обоих). Неважно, на что он установлен; Я использую DELIMIDENT=1, когда мне нужны идентификаторы с разделителями.

Как вы создали таблицу в базе данных Informix? Если вы не создали таблицу с установленным DELIMIDENT, имя таблицы не будет чувствительно к регистру; вам не нужны кавычки вокруг имени таблицы.

Тот факт, что вы получаете ошибку -201, означает, что вы прошли через процесс подключения; это хорошее начало и упрощает последующее.

Я не уверен, используете ли вы Unix-машину или Windows-машину - это часто помогает указать на это. В Windows вам может потребоваться установить среду с помощью SETNET32 (программа Informix), или может быть способ указать DELIMIDENT в строке подключения. В Unix вы, вероятно, устанавливаете его в своей среде, а программное обеспечение R подхватывает его. Однако могут возникнуть проблемы, если вы запустите R с помощью некоторой кнопки меню или опции в среде графического интерфейса; есть вероятность, что профиль не будет выполнен до запуска программы R.

1 голос
/ 19 мая 2011

Вы можете попробовать использовать функцию sqlQuery() в RODBC для получения ваших результатов. Это функция, которую я использую на работе, и с ней никогда не было проблем:

sqlQuery(channel, "select top 10 * from exampleTABLE")

Вы должны быть в состоянии поместить все свои запросы в список и выполнять их итерацию, как и раньше:

dat <- lapply(queries, function(x) sqlQuery(channel, x))

где запросы - это ваш список запросов, а канал - это ваше открытое соединение ODBC. Думаю, мне следует также призвать вас закрыть указанное соединение, когда вы закончите с odbcCloseAll()

...