dbplyr база данных ограничения псевдонимов Oracle

После долгого процесса устранения неполадок я наконец получил 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 отлично работает с мгновенным клиентом.

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

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

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

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

Я немного раздражен. Мне потребовалось почти три недели, чтобы установить соединение odbc с моей рабочей базой данных с помощью мгновенного клиента. Я с самого начала мог выполнять запросы с помощью RODBC и ROracle, но хотел использовать dplyr. В итоге это не сработало, и у меня не осталось много сока, чтобы понять, почему. Любая помощь будет очень признательна на этом этапе.


person aodwbag    schedule 11.01.2020    source источник
comment
Правильно ли я понимаю, что второе решение работает для вас, но вы не можете использовать для этого dbplyr? Можете ли вы получить SQL-код, добавив get_query() в конце?   -  person mnist    schedule 11.01.2020
comment
Я сталкивался с этим раньше, и иногда (не всегда) использование функции in_schema работает . Думаю, для вас это будет что-то вроде tbl(con, in_schema("long_shcema_name”, “very_long_and_descriptive_name"))   -  person Wil    schedule 11.01.2020
comment
Функция in_schema работает. Вы хоть представляете, когда это не работает? Обычно я пытаюсь указать схему в строке подключения, поэтому мне интересно, можно ли ввести дополнительную совместимость между odbc и dbplyr.   -  person aodwbag    schedule 13.01.2020


Ответы (1)


Проблема, скорее всего, не в длинных именах файлов (если имена ваших таблиц не длиннее 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

Вместо как:

  • база данных = {по умолчанию}
  • 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)

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

person Simon.S.A.    schedule 11.01.2020