【问题标题】:Postgres PLV8 function with 'RETURNS TABLE' throws 'ERROR: ReferenceError: $1 is not defined'带有“RETURNS TABLE”的 Postgres PLV8 函数抛出“错误:ReferenceError:$1 未定义”
【发布时间】: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)

案例2SETOF 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


【解决方案1】:

使用命名参数似乎可以正常工作,例如"创建或替换函数 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};

$$;

【讨论】:

  • 问题是“为什么它不适用于RETURNS TABLE...?”。
  • 必须是他们处理返回表函数参数的方式不同。 plv8 的源代码是可用的,但我的 C 有点生疏。 github.com/plv8/plv8 有什么原因不能使用命名参数而不是 $1 吗?
猜你喜欢
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多