我有一个同义词:
CREATE OR REPLACE SYNONYM sample-table-name FOR master.sample-table-name
我想通过使用RJDBC库使用R语言来执行此操作。我尝试过不同的函数,包括dbGetQuery函数等。但它无法执行此语句。
有人可以告知如何在R。
中执行这些陈述答案 0 :(得分:1)
我希望使用dbExecute()
可以正常工作。如果不这样做,dbSendStatement()
几乎肯定会起作用,因为它似乎是针对那种DDL。
dbGetQuery
上的文档说:
此方法仅适用于SELECT查询
要查看可用的功能,执行ls('package:DBI')
之类的操作会很有帮助。根据文档:
dbExecute
:
执行语句并返回受影响的行数。 dbExecute()附带一个默认实现(应该可以使用) 然后,调用dbSendStatement()的大多数后端 dbGetRowsAffected(),确保结果始终为free-d by dbClearResult()。
dbSendStatement
:
dbSendStatement()方法仅提交并同步执行 SQL数据操作语句(例如,UPDATE,DELETE,INSERT INTO,DROP TABLE,...)到数据库引擎。查询号码 受影响的行,在返回的结果对象上调用dbGetRowsAffected()。 之后你还必须调用dbClearResult()。对于交互式使用, 你几乎总是喜欢dbExecute()。
编辑:这些方法可能适用于DBI
的其他实施,也许可能适用于RJDBC
。无论如何,看起来他们已经使用dbSendStatement()
实施了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)