我有一个同义词声明:
CREATE OR REPLACE SYNONYM sample-table-name FOR master.sample-table-name
我想通过使用 RJDBC 库的 R 语言来执行此操作。我尝试了不同的函数,包括 dbGetQuery 函数等。但它无法执行此语句。
有人可以建议如何在 R 中执行这些语句。
我希望使用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)