RPostgreSQL调用返回void的PostgreSQL函数报错,如何修复?
修复RPostgreSQL调用void类型函数的错误
错误原因
- RPostgreSQL无法识别PostgreSQL的
void数据类型,用SELECT调用返回void的函数时,会生成一个void类型的列,触发类型不匹配警告。 - 连接存在未清理的结果集,导致无法直接关闭连接,触发
connection has pending rows错误。另外你的代码存在语法问题:dbClearResult的调用少了一个右括号。
修复方案
方案一:使用DO语句执行函数(推荐)
用PostgreSQL的DO块执行void函数,不会生成结果集,从根源避免类型识别和未处理结果集的问题:
con <- connect_to_my_postgres_database() # 用DO块执行void函数,无需处理结果集 dbExecute(con, "DO $$ BEGIN function_that_returns_void(); END $$;") postgresqlCloseConnection(con)
方案二:正确处理SELECT的结果集
如果必须用SELECT调用,需要显式发送查询并清理结果集:
con <- connect_to_my_postgres_database() # 发送查询并获取结果对象 res <- dbSendQuery(con, "select function_that_returns_void()") # 强制清理结果集,释放连接资源 dbClearResult(res) postgresqlCloseConnection(con)
注意事项
- 不要用
dbExecute直接调用返回void的SELECT语句,dbExecute更适配INSERT/UPDATE/DELETE这类返回受影响行数的操作;对于返回结果集的语句(哪怕是void类型),用dbSendQuery配合dbClearResult处理更稳妥。 - 检查代码语法,确保括号匹配,原代码中
dbClearResult的调用缺少一个右括号,会引发额外语法错误。
内容的提问来源于stack exchange,提问作者Mefitico
相关产品推荐
相关产品推荐

