执行授权或同义词的功能是什么?

时间:2017-06-28 09:03:14

标签: r rjdbc

我有一个同义词:

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

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

有人可以告知如何在R。

中执行这些陈述

1 个答案:

答案 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)