当使用 'odbc'、'DBI' 包从 R 创建表时,"Select * from <table_name>" 在 Oracle 11g 中不工作

"Select * from <table_name>" not working from Oracle 11g when tables are created from R using 'odbc', 'DBI' package

我使用两种方法在 'Oracle Database 11g Express Edition' 中创建了一些 table:

方法 1: 从 R 使用 odbc 和 DBI 包

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

并创建 table 'cars'.

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

方法二: 来自 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

显然,它创建了 tables。

现在的问题是: 当尝试 view/read 时,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

请帮忙。谢谢。

您的 DBI 调用正在使用 name = "cars",您可以从 user_tables 的查询中看到正在创建 table with a quoted-identifier name,因为它显示为小写cars。您为 my_table 使用了不带引号的标识符,因此在该查询结果中它是大写的。

因为 cars 是一个带引号的标识符,所以你必须在任何地方都用引号括起来:

select * from "cars";

但这很痛苦,没有人会感谢你使用带引号的标识符(最好完全避免使用它们,除非出于某种原因你 有一个带引号的名称,基于上面链接的文档中的规则);所以最好将您的 DBI 调用更改为使用:

name = "CARS"

这将导致 table 使用不带引号的标识符创建,这意味着您的原始 dbGetQuery 现在可以在任何情况下使用 table 名称 - 这对于任何不带引号的名称都是正确的标识符(这就是 from my_table 起作用的原因)。

根据您看到的错误,您还需要更改 dbReadTable 调用以也使用大写字母 "CARS""MY_TABLE"