0

我编写了一个函数来查询 x、y、z 值以使用 R 创建部分。现在,我想用 PL/R 来做这件事,而不是使用 RStudio。

CREATE OR REPLACE FUNCTION section_graph() RETURNS text AS
'
require(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host="localhost", user="postgres", password="...", dbname="...", port="5432")
rs <- dbSendQuery(con, "SELECT x,y,z FROM (SELECT (section(1,3)).*) AS foo")
section1 <- fetch(rs, 2000)
dbClearResult(rs)
dbDisconnect(con)
pdf("/tmp/myplot.pdf", width=18, height=9)
plot(section1$y, section1$z, type="l", lwd=1.5, lty=3)
dev.off()
print("done")
'
LANGUAGE 'plr';

dbSendQuery命令中有查询SELECT x,y,z FROM (SELECT (section(1,3)).*) AS foo。参数1代表一个ID,第二个是截面的精度(3m)。

现在,我想像普通的 PostgreSQL 函数一样使用上面的函数(例如,使用语言“sql”)。这意味着,想要在函数中定义参数,如下所示:

SELECT x,y,z FROM (SELECT (section($1,$2)).*) AS foo

$1 $2是我的函数的参数section_graph

语言“plr”可以做到这一点吗?我没有找到有用的东西。

显然函数内查询的双引号存在问题。

4

1 回答 1

2

您是否尝试查看 pl/r 文档?我花了大约十秒钟。参数被调用arg1argN

CREATE OR REPLACE FUNCTION r_max (integer, integer) RETURNS integer AS '
    if (arg1 > arg2)
       return(arg1)
    else
       return(arg2)
' LANGUAGE 'plr' STRICT;

或者,PG 8 及更高版本,您可以将它们命名为:

CREATE OR REPLACE FUNCTION sd(vals float8[]) RETURNS float AS '
    sd(vals)
' LANGUAGE 'plr' STRICT;

http://www.joeconway.com/plr/doc/plr-funcs.html

不过,您的代码中的其他内容让我感到恐惧。请记住,这个 R 代码在执行查询时被 Postgres 服务器调用,而您正在连接到可能是同一个 Postgres 服务器并执行另一个查询。这看起来像十几种错误。

在 PL/R 中访问数据库的正确方法是通过“正常支持”部分中概述的例程:

http://www.joeconway.com/plr/doc/plr-spi-rsupport-funcs-normal.html

有一些“兼容性支持”函数类似于 RPostgreSQL 包函数:

http://www.joeconway.com/plr/doc/plr-spi-rsupport-funcs-compat.html

但是如果你require(RPostgreSQL)在你的 PL/R 代码中你可能会掩盖它们,你的数据库就会消失在一个黑洞中。在 PL/R 函数中使用“正常支持”例程。

于 2013-12-23T08:46:46.630 回答