2015-07-02 1 views
2

Попытка вернуть таблицу из PLV8 хранимой процедуры.

Он не может распознать входные аргументы, то есть $1, когда функция с RETURNS TABLE(...).

Он работает, когда функция возвращает скаляры:

psql# CREATE OR REPLACE function foo(integer) 
     RETURNS integer 
     LANGUAGE plv8 
     AS $$ 
     var a=$1; 
     return a; 
     $$; 
CREATE FUNCTION 
psql# SELECT * FROM foo(10); 
foo 
----- 
    10 
(1 row) 

Это также работает, если функция RETURNS SETOF.

(Case 1) С типа данных:

psql# CREATE TYPE myrow as (bar int); 
CREATE TYPE 
psql# CREATE OR REPLACE function foo(integer) 
     RETURNS SETOF myrow 
     LANGUAGE plv8 
     AS $$ 
     var a=$1; 
     return {"bar": a}; 
     // Or alternatively: 
     // return plv8.execute('SELECT ' + a +' AS bar'); 
     $$; 
CREATE FUNCTION 
psql# SELECT * FROM foo(10); 
bar 
----- 
    10 
(1 row) 

(Case 2) С SETOF record:

psql# CREATE OR REPLACE function foo(integer) 
     RETURNS SETOF record 
     LANGUAGE plv8 
     AS $$ 
     var a=$1; 
     return {"bar": a}; 
     // Or alternatively: 
     // return plv8.execute('SELECT ' + a +' AS bar'); 
     $$; 
CREATE FUNCTION 
psql# SELECT * FROM foo(10) AS xxx(bar int); 
bar 
----- 
    10 
(1 row) 

Но это не похоже на работу с RETURNS TABLE:

psql# CREATE OR REPLACE FUNCTION foo(integer) 
     RETURNS TABLE(bar int) 
     LANGUAGE plv8 
     AS $$ 
     var a=$1; 
     return {"bar": a}; 
     // Doesn't matter cause it doesn't make it here, 
     // but alternative 'return' also fails with same error: 
     // return plv8.execute('SELECT ' + a + ' AS bar'); 
     $$; 
CREATE FUNCTION 

psql# SELECT * FROM foo(10); 
ERROR: ReferenceError: $1 is not defined 
DETAIL: foo() LINE 2: var a=$1; 

Любая идея, почему она задыхается на $1?

Я нахожусь на Postgres 9.4.0 и Plv8 1.4.4.

+0

Кажется, что он работает нормально с именованными аргументами, например. «СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ foo (целое число)» –

ответ

0

Кажется, что работает ОК с именованными аргументами, например. «СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ foo (целое число)»

Я действительно искал, как вернуть более одного значения из функции plv8. Для дальнейшего использования, параметры OUT, похоже, являются способом перехода, например.

CREATE OR REPLACE FUNCTION foo(a integer, OUT b integer, OUT c integer) 
RETURNS setof record 
LANGUAGE plv8 
AS $$ 

return {b: a * 2, c: a * 10}; 

$$; 
+0

Вопрос был «почему он не работает с« RETURNS TABLE ... »?». –

+0

Должна быть разница в том, как они обрабатывают параметры для функций, которые RETURNS TABLE. Исходный код для plv8 доступен, но мой C немного ржавый. https://github.com/plv8/plv8 Есть ли причина, по которой вы не можете использовать именованный параметр вместо $ 1? –