Вставка данных из фрейма данных в R в предопределенную таблицу базы данных Teradata работает нормально и довольно быстро для небольших (несколько строк) фреймов данных. Однако я обнаружил странное поведение при вставке многих числовых значений. процесс вставки завершается с ошибкой:
Ошибка в result_insert_dataframe (rs @ ptr, значения):
nanodbc / nanodbc.cpp: 1791: HY104: [Teradata] [Драйвер ODBC Teradata]
Неверная точность: значение cbColDef вне диапазона
Вот небольшой реперс:
/* Teradata database - creating table */
create table upload_test (
ID INTEGER,
val DECIMAL(8,4)
);
Вставка небольшого информационного кадра работает нормально:
# R creating dataframe and send it to db
up_test1k = tibble(ID=1:1000, val=0.1234)
con = DBI::dbConnect(odbc::odbc(), ...)
dbplyr::db_insert_into(con, "upload_test", up_test1k)
Ошибка вставки кадра данных с 2000 строками:
up_test2k = tibble(ID=1:2000, val=0.1234)
dbplyr::db_insert_into(con, "upload_test", up_test2k)
Error in result_insert_dataframe(rs@ptr, values) :
nanodbc/nanodbc.cpp:1791: HY104: [Teradata][ODBC Teradata Driver] Invalid
precision: cbColDef value out of range
То же поведение (1000 строк в порядке, 2000 строк не удалось) с
- с использованием другой функции: DBI :: dbWriteTable (..., append = TRUE)
- изменение определения столбца на DECIMAL (18,8)
- определение val as.character () в кадре данных
Вставка больших фреймов данных (> 10 000 строк), содержащих только целые числа и символы, работает нормально.
Системная информация:
- R.Version () $ version.string "Версия R 3.5.0 (2018-04-23)"
- packageVersion ("odbc") .6 1.1.6 ’
- packageVersion ("DBI") ‘1.0.0’
- packageVersion ("dbplyr") ‘1.3.0’
- выберите * из dbc.dbcinfo; ВЕРСИЯ 15.10.07.04