我编写了一个函数来查询用于创建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'语言?我没有找到有用的东西。
显然,函数中查询的双引号存在问题。
答案 0 :(得分:2)
您是否尝试过查看pl / r文档?花了我大约十秒钟。这些参数称为arg1
到argN
:
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函数中的“常规支持”例程。