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") не делает.

Другие вопросы по тегам