【发布时间】:2015-07-02 15:58:44
【问题描述】:
试图从PLV8 存储过程返回表。
当函数使用RETURNS TABLE(...)时,它无法识别输入参数,即$1。
当函数返回标量时有效:
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也可以。
(案例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)
(案例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。
【问题讨论】:
-
使用命名参数似乎可以正常工作,例如"创建或替换函数 foo(一个整数)"
标签: javascript postgresql stored-procedures plv8