PL/R (plr) возвращает ошибку при двойном использовании dbSendQuery в функции; "plr_cursor" уже существует

Я установил PL/R (plr) и расширил свою базу данных этим.

Я создал функцию, которая создает PDF-печать из графика. Данные запрашиваются из моей базы данных PostgreSQL:

CREATE OR REPLACE FUNCTION f_graph() RETURNS text AS
'
require(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host="localhost", user="postgres", password="pass",dbname="landslide", port="5432")
rs <- dbSendQuery(con, "SELECT x,y,z FROM section_coordinates WHERE id=1")
section1 <- fetch(rs, 2000)
pdf("/tmp/myplot.pdf", width=18, height=12)
plot(section1$y, section1$z, xlab="distance in m", ylab="altitude in m a.s.l.",main="Section Einbühl Ebermannstadt", type="l", lwd=1.5, lty=3)
dev.off()
print("done")
'
LANGUAGE 'plr' VOLATILE STRICT;

Но когда я хочу запросить два набора результатов (section1, section2), как в этой расширенной функции:

CREATE OR REPLACE FUNCTION f_graph() RETURNS text AS
'
require(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host="localhost", user="postgres", password="pass", dbname="landslide", port="5432")
rs <- dbSendQuery(con, "SELECT x,y,z FROM section_coordinates WHERE id=1")
section1 <- fetch(rs, 2000)
rs <- dbSendQuery(con, "SELECT x,y,z FROM section_coordinates WHERE id=2")
section2 <- fetch(rs, 2000)
pdf("/tmp/myplot.pdf", width=18, height=12)
plot(section1$y, section1$z, xlab="distance in m", ylab="altitude in m a.s.l.", main="Section Einbühl Ebermannstadt", type="l", lwd=1.5, lty=3)
lines(section2$y, section2$z, xlab="", ylab="", type="l", lwd=2.5, col="red")
dev.off()
print("done")
'
LANGUAGE 'plr' VOLATILE STRICT;

Появляется следующая ошибка:

landslide=# SELECT f_graph();
ERROR:  R interpreter expression evaluation error
DETAIL:  Error in pg.spi.cursor_open("plr_cursor", plan) : 
error in SQL statement : cursor "plr_cursor" already exists
CONTEXT:  In R support function pg.spi.cursor_open
In PL/R function f_graph

Как можно решить эту проблему? Могу ли я установить несколько plr_cursors?

1 ответ

Решение

Вы должны очистить результат, прежде чем запрашивать больше данных, я думаю.

Попробуй использовать dbClearResult после того, как вы получили первый результат

section1 <- fetch(rs, 2000)
dbClearResult(rs)

Даже если нет ошибок, используйте dbClearResult(rs) после последней загрузки, перед закрытием соединения с dbDisconnect(con),

Другие вопросы по тегам