2016-09-07 6 views
1

ROracle(directions in the packageに続いて)をインストールし、Oracleデータベースに正常に接続しました。ROracle:dbGetQueryは動作しますが、dbListTablesなどの機能はありません

私はdbGetQueryを使用して、クエリを実行し、うまく結果を得ることができるが、例えば:

> dbListTables(con) 
character(0) 

> dbReadTable(con, "table_name") 
Error in .oci.GetQuery(con, qry) : 
    ORA-00942: table or view does not exist 

どれ:

> dbGetQuery(con, "select count(*) from table_name") 
    COUNT(*) 
1  6111 

はしかし、他のDBI/ROracleヘルパー機能の一部は結果が得られていません何が原因であるかもしれないアイデア?

答えて

1

どちらの場合も、彼らは私のために働く私はschema引数を指定した場合、すなわち

dbListTables(con, schema = "my_schema") 
dbReadTable(con,"table_name",schema = "my_schema") 

さらに、それはすべてのスキーマに見えるようにするかどうかを制御しallfull引数を持っていることを?dbListTablesを読んでから表示されますスキーマ名全体またはテーブル名だけを返すかどうかを指定します。

+0

実際には、スキーマは必要ないと分かりましたが、テーブル名は大文字で 'dbReadTable'(ただし' dbGetQuery'ではなく)でなければなりません。下の私の答えを見てください。 –

0

この問題の最下部まで行き過ぎると、私は後世の答えを記録したいと思います。実際にはdbReadTableではスキーマを持つ必要はありませんが、テーブル名を大文字にするのはです。つまり、コールは

dbReadQuery(con, "TABLE_NAME") 

である必要があります。 dbReadTableselect * from table呼び出しでdbGetQuery異なる方法を見つけるために

は、私はソースのために掘っ:

> 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のソースに、here見出すことができます。引数の有効性を確認し、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はテーブル名の引用符付き文字列を生成し、quoted table names are case sensitive! (dbGetQueryはただ小文字することができます引用符で囲まれていないテーブル名を渡します。)dbGetQuery(con, "select count(*) from table_name")作品は、同じようdbReadQuery(con, "TABLE_NAME")しかしdbReadQuery(con, "table_name")がない理由

は、だからです。

関連する問題