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)
,