2

我有一个同义词声明:

CREATE OR REPLACE SYNONYM  sample-table-name FOR master.sample-table-name

我想通过使用 RJDBC 库的 R 语言来执行此操作。我尝试了不同的函数,包括 dbGetQuery 函数等。但它无法执行此语句。

有人可以建议如何在 R 中执行这些语句。

4

1 回答 1

2

我希望使用dbExecute()应该有效。如果做不到这一点,dbSendStatement()几乎肯定会起作用,因为它似乎是为那种 DDL 设计的。

上的文档dbGetQuery说:

此方法仅适用于 SELECT 查询

要查看可供您使用的功能,执行类似ls('package:DBI'). 根据文档:

dbExecute

执行一条语句并返回受影响的行数。dbExecute() 带有一个默认实现(它应该适用于大多数后端),它调用 dbSendStatement(),然后调用 dbGetRowsAffected(),确保结果始终由 dbClearResult() 释放。

dbSendStatement

dbSendStatement() 方法只向数据库引擎提交并同步执行 SQL 数据操作语句(例如,UPDATE、DELETE、INSERT INTO、DROP TABLE,...)。要查询受影响的行数,请对返回的结果对象调用 dbGetRowsAffected()。之后您还必须调用 dbClearResult()。对于交互式使用,您应该几乎总是更喜欢 dbExecute()。

编辑:这些方法可能会适用于 的其他实现DBI,并且可能适用RJDBC于未来。无论如何,看起来他们已经实现了dbSendStatement()using dbSendQuery(),所以他们不会为此目的工作。

RJDBC框架中,dbSendUpdate()就是你想要的。

dbSendQuery 和 dbSendUpdate 向数据库提交 SQL 查询。两者之间的区别仅在于 dbSendUpdate 与 DBML 查询一起使用,因此不返回任何结果集。

在另一个 DBMS 上使用类似查询确认:

dbSendStatement(conn,'SET search_path=public;')
#Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ",  : 
#Unable to retrieve JDBC result set for SET search_path=public; (No results were returned by the query.)

traceback()
#7: stop(..., " (", .jcall(x, "S", "getMessage"), ")")
#6: .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ", 
#       statement)
#5: .local(conn, statement, ...)
#4: dbSendQuery(conn, statement, ...)
#3: dbSendQuery(conn, statement, ...)                ## this is the problem
#2: dbSendStatement(conn, "SET search_path=public;")
#1: dbSendStatement(conn, "SET search_path=public;")

dbSendUpdate(conn, 'SET search_path=public;')
# successful

dbCommit(conn)
# persist the change past the current session (RJDBC seems to give you transaction control here)
于 2017-06-28T10:27:56.300 回答