如何在PL / R(plr)函数中定义变量作为内部查询的参数

时间:2013-12-22 15:24:41

标签: r postgresql user-defined-functions rpostgresql plr

我编写了一个函数来查询用于创建R部分的x,y,z值。 现在,我想用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'语言?我没有找到有用的东西。

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

1 个答案:

答案 0 :(得分: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

但如果您在PL / R代码中require(RPostgreSQL),您可能会掩盖它们,并且您的数据库将消失在黑洞中。使用PL / R函数中的“常规支持”例程。