2013-12-22 13 views
0

Я написал функцию, которая запрашивает значения x, y, z для создания разделов с R. Теперь я хочу сделать это с PL/R, вместо использования RStudio.Как определить переменные в функции PL/R (plr) как параметры для запроса внутри

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 представляет собой идентификатор, второй - точность сечения (3 м).

Теперь я хочу использовать свою функцию выше, как обычную функцию PostgreSQL (например, с языком «sql»). Это означает, что запрос на покупку для определения параметров в пределах функции, как это:

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

$1$2 являются параметрами для моей функции section_graph.

Возможно ли это на языке «plr»? Я не нашел что-то полезное.

Очевидно, что существуют проблемы с двойными кавычками запроса внутри функции.

ответ

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

но если вы require(RPostgreSQL) в вашем PL/R код, который вы, вероятно, маскировать их, и ваша база данных будет исчезать до черной дыры. Используйте процедуры «нормальной поддержки» в функциях PL/R.

+0

Не уверен, что черная дыра все еще является риском, но слайд 8 говорит, что параметры связи будут игнорироваться: http://www.joeconway.com/presentations/plr-PGConfNYC2014.pdf N.b. Я еще не проверял, открывается ли еще одно соединение ... – steevee

 Смежные вопросы

  • Нет связанных вопросов^_^