当使用 '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"
。
我使用两种方法在 '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"
。