"Выбрать из«не работает из Oracle 11g, когда таблицы создаются из R с использованием пакета« odbc », пакет« DBI » - PullRequest
0 голосов
/ 28 сентября 2018

Я создал несколько таблиц в Oracle Database 11g Express Edition, используя два метода:

Метод-1: Из R с использованием odbc и пакета DBI

library(odbc)
db <- odbc::dbConnect(odbc::odbc(),
                'Oracle ODBC',
                uid = "raja",
                pwd = "test123")

И создайте таблицу 'cars'.

DBI::dbWriteTable(conn = db, name = "cars", value = cars,
             append = T, row.names = F, overwrite = F)

Метод-2: Из командной строки sqlplus

create table my_table 
(id int not null,
 text varchar2(1000),
 primary key (id)
);

insert into my_table (id, text) values (1, 'This is some text.');

Для проверки я запустил

SQL> select table_name from user_tables;
cars
mtcars
MY_TABLE

Очевидно, он создает таблицы.

Теперь проблема заключается в следующем: При попытке просмотра / чтения таблиц успех и ошибка происходит по следующей схеме.

От R:

Успех:

> DBI::dbReadTable(db, "cars")

Ошибка:

> DBI::dbReadTable(db, "my_table")
Error: <SQL> 'SELECT * FROM "my_table"'
  nanodbc/nanodbc.cpp:1587: 42S02: [Oracle][ODBC][Ora]ORA-00942: table or view does not exist

Ошибка:

> DBI::dbGetQuery(db, "select * from cars;")
Error: <SQL> 'select * from cars;'
  nanodbc/nanodbc.cpp:1587: 42S02: [Oracle][ODBC][Ora]ORA-00942: table or view does not exist

Из sqlplus:

Успех:

select * from my_table;

Ошибка:

select * from cars;
ERROR at line 1:
    ORA-00942: table or view does not exist

Пожалуйста, помогите.Спасибо.

1 Ответ

0 голосов
/ 28 сентября 2018

Ваш вызов DBI использует name = "cars", и из запроса user_tables видно, что таблица создается с именем идентификатора в кавычках , так как оно отображается в нижнем регистре cars,Вы использовали без кавычки идентификатор для my_table, так что в этом результате в верхнем регистре есть заглавные буквы.

Поскольку cars является идентификатором в кавычках, его нужно заключать в кавычки везде:

select * from "cars";

Ноэто боль, и никто не поблагодарит вас за использование идентификатора в кавычках (действительно лучше избегать их полностью, если только по какой-то причине у вас нет , чтобы иметь имя в кавычках, основываясь на правилах в связанной документациивыше);так что было бы лучше изменить ваш вызов DBI на использование:

name = "CARS"

, что приведет к созданию таблицы с идентификатором без кавычек, то есть ваш исходный dbGetQuery теперь будет работать с именем таблицы в любомcase - что верно для любого идентификатора без кавычек (именно поэтому from my_table сработал).

Вам также необходимо изменить ваш вызов dbReadTable, чтобы также использовать прописные буквы "CARS" и "MY_TABLE", отошибки, которые вы видите.

...