首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有“返回表”抛出错误的Postgres PLV8函数: ReferenceError:$1未定义

带有“返回表”抛出错误的Postgres PLV8函数: ReferenceError:$1未定义
EN

Stack Overflow用户
提问于 2015-07-02 15:58:44
回答 1查看 886关注 0票数 2

试图从PLV8存储过程返回表。

当函数使用$1时,它无法识别输入args,即RETURNS TABLE(...)

当函数返回标量时,它可以工作:

代码语言:javascript
复制
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)具有自定义数据类型:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2015-08-10 20:22:59

对于命名的参数,它似乎工作得很好。“创建或替换函数foo(整数)”

实际上,我在寻找如何从plv8函数返回多个值。作为将来的参考,OUT参数似乎是可行的。

代码语言:javascript
复制
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};

$$;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31189363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档