база данных ограничения псевдонимов dbplyr Oracle - PullRequest
1 голос
/ 11 января 2020

После долгого процесса поиска и устранения неисправностей я наконец-то заставил RStudio подключиться к моей базе данных Oracle с помощью мгновенного клиента. Мотивация для этого состояла в том, чтобы использовать dbplyr для выполнения большинства моих запросов. Однако я не могу отправить какие-либо запросы через dbplyr, так как все имена столбцов и таблиц очень длинные и приводят к ORA-00972: identifier is too long.

Пример ошибки

 test <- tbl(con, "long_shcema_name.very_long_and_descriptive_name") %>%
   select(a_column)
Error: nanodbc/nanodbc.cpp:1617: 42000: [Oracle][ODBC][Ora]ORA-00972: identifier is too long

<SQL> 'SELECT *
FROM ("long_shcema_name.very_long_and_descriptive_name") "zzz7"
WHERE (0 = 1)'

Я думал, что Проблема была связана с драйвером. Моя работа использует Oracle 12.2, который имеет больший предел для идентификаторов, но dbGetQuery отлично работает с InstantClient

Рабочий пример без dbplyr

dbGetQuery(con,'
  select "a_column"
  from 
  long_shcema_name.very_long_and_descriptive_name')
a_column
    1
    0
    2
    .
    .
    .

Это дает мне желаемые результаты.

Есть ли решение?

Я немного раздражен. Мне потребовалось почти три недели, чтобы настроить соединение odb c с моей базой данных работ с помощью мгновенного клиента. Я был в состоянии сделать запрос, используя RODB C и R Oracle из get go, но хотел использовать dplyr. Это закончилось тем, что не работало, и у меня нет большого количества сока, чтобы выяснить, почему. На этом этапе любая помощь будет чрезвычайно ценной.

1 Ответ

1 голос
/ 11 января 2020

Скорее всего, проблема не в длинных именах файлов (если имена таблиц не длиннее 30 символов, см. здесь ), а в использовании схемы. Oracle может использовать двойные кавычки для идентификации базы данных, схемы и имен таблиц ( ref ). Квадратные скобки иногда также используются для этой цели ( ref ).

Посмотрите на SQL, который выдает сообщение об ошибке:

SELECT *
FROM ("long_schema_name.very_long_and_descriptive_name") "zzz7"
WHERE (0 = 1)

Это скорее всего интерпретируется как:

  • база данных = {по умолчанию}
  • схема = {пусто}
  • table = long_schema_name.very_long_and_descriptive_name

Вместо:

  • database = {default}
  • schema = long_schema_name
  • table = very_long_and_descriptive_name

Как комментарии @Wil Вы можете решить эту проблему с помощью функции in_schema. Если вы попытаетесь:

 test <- tbl(con, in_schema("long_schema_name","very_long_and_descriptive_name") %>%
   select(a_column)

, то show_query(test) должно вернуть:

SELECT *
FROM ("long_schema_name"."very_long_and_descriptive_name") "zzz7"
WHERE (0 = 1)

Обратите внимание, как это отличается от первого запроса добавлением двойных кавычек по обе стороны от полной остановки.

...