ROracle: dbGetQuery работает, но dbListTables и другие функции не работают
Я установил ROracle (следуя инструкциям в пакете) и успешно подключился к нашей базе данных Oracle.
Я могу выполнять запросы, используя dbGetQuery
и получить результаты просто отлично, например:
> dbGetQuery(con, "select count(*) from table_name")
COUNT(*)
1 6111
Однако некоторые другие вспомогательные функции DBI/ROracle не дают результатов:
> dbListTables(con)
character(0)
> dbReadTable(con, "table_name")
Error in .oci.GetQuery(con, qry) :
ORA-00942: table or view does not exist
Есть идеи, в чем может быть причина?
2 ответа
В обоих случаях они работают для меня, если я укажу schema
аргумент, т.е.
dbListTables(con, schema = "my_schema")
dbReadTable(con,"table_name",schema = "my_schema")
Кроме того, как видно из чтения ?dbListTables
что у него есть all
а также full
аргументы, управляющие тем, следует ли искать во всех схемах и возвращать ли полное имя схемы или только имя таблицы.
Потратив слишком много времени, пытаясь разобраться в этом вопросе, я хочу записать ответ для потомков. На самом деле наличие схемы не обязательно в dbReadTable
, но имя таблицы в верхнем регистре. То есть звонок должен быть
dbReadQuery(con, "TABLE_NAME")
Зачем?
Чтобы узнать, как dbReadTable
отличается от dbGetQuery
с select * from table
позвони, я покопался за источник:
> showMethods("dbReadTable")
Function: dbReadTable (package DBI)
conn="OraConnection", name="character"
Так что это метод S4. Мы используем getMethod
с вышеуказанной подписью:
> getMethod("dbReadTable", signature = c(conn = "OraConnection", name = "character"))
Method Definition:
function (conn, name, ...)
{
.local <- function (conn, name, schema = NULL, row.names = NULL,
...)
.oci.ReadTable(conn, name, schema = schema, row.names = row.names)
.local(conn, name, ...)
}
<environment: namespace:ROracle>
.oci.ReadTable
можно найти здесь, в источнике ROracle. Все, что он делает, это проверяет правильность аргумента, вызывает dbGetQuery
и установите имена строк. Соответствующая часть (вызов dbGetQuery
) это здесь:
# form name
if (is.null(schema))
tab <- sprintf('"%s"', name)
else
tab <- sprintf('"%s"."%s"', schema, name)
# read table
qry <- paste('select *',
'from', tab)
res <- .oci.GetQuery(con, qry)
Обратите внимание, что если схема не указана, имя таблицы используется без "схемы". префикс. Тем не мение, sprintf
создает строку в кавычках для имени таблицы, а имена в кавычках чувствительны к регистру! (dbGetQuery
просто передает имя таблицы без кавычек, которое может быть в нижнем регистре.)
Вот почему dbGetQuery(con, "select count(*) from table_name")
работает, как и dbReadQuery(con, "TABLE_NAME")
но dbReadQuery(con, "table_name")
не делает.