通过从节点到postgres的功能PLPGSQL阵列(Pass array from node-po

2019-07-03 17:27发布

该PLPGSQL功能:

CREATE OR REPLACE FUNCTION testarray (int[]) returns int as $$
  DECLARE
    len int;
  BEGIN
    len := array_upper($1);
  return len;
  END
$$ language plpgsql;

节点-Postgres的查询+测试数组:

var ta = [1,2,3,4,5];
client.query('SELECT testarray($1)', [ta], function(err, result) {
  console.log('err: ' + err);
  console.log('result: ' + result);
});

从节点服务器的输出:

ERR:错误:数组值必须以“{”或尺寸信息
结果:未定义

我也试着像客户端查询投参数testarray($1::int[])这回同样的错误。

我改变了函数参数(anyarray int)和输出误差变化:

错误:错误:整数无效的输入语法:“1,2,3,4,5”
结果:未定义

以及其他几个变化。

我追求的是不产生任何错误,并返回5的变化。

我读到有关Postgres的解析阵列的问题 ,并在节点的Postgres参数化数组这个计算器的问题:

  • 节点postgres的:如何执行“WHERE COL IN(<动态值列表>)”查询?

但答案似乎并不在那里。

Answer 1:

该参数是在这些形式之一:

'{1,2,3,4,5}'         -- array literal
'{1,2,3,4,5}'::int[]  -- array literal with explicit cast
ARRAY[1,2,3,4,5]      -- array constructor

此外,您还可以简化您的功能:

CREATE OR REPLACE FUNCTION testarray (int[])
  RETURNS int AS
$func$
BEGIN
  RETURN array_length($1, 1);
END
$func$ LANGUAGE plpgsql IMMUTABLE;

或者简单的SQL函数:

CREATE OR REPLACE FUNCTION testarray2 (int[])
  RETURNS int AS 'SELECT array_length($1, 1)' LANGUAGE sql IMMUTABLE;

或者只是使用array_length($1, 1)直接。

  • array_upper()错误的函数。 数组可以有任意标。 array_length()做了你在找什么。 相关问题:

    • 正常化数组下标1维阵列,使他们从1开始
  • 无论array_length()array_upper()需要两个参数。 第二个是数组维度- 1 ,你的情况。



Answer 2:

根据您发布的答案,这可能会为你工作:

var ta = [1,2,3,4,5];
var params = [];
for(var i = 1, i <= ta.length; i++) {
    params.push('$'+i);
}
var ta = [1,2,3,4,5];
client.query('SELECT testarray(\'{' + params.join(', ') + '}\')', ta, function(err, result) {
  console.log('err: ' + err);
  console.log('result: ' + result);
});


Answer 3:

得益于PinnyM和欧文的响应。 我回顾了选项和重读相关的答案。

由欧文描述的阵列格式节点postgres的工作字面上如下:

'select testarray(' + "'{1,2,3,4,5}'" + ')'
'select testarray(' + "'{1,2,3,4,5}'" + '::INT[])'
'select testarray(ARRAY[1,2,3,4,5])'

在TL:博士的JavaScript引用

,设定参数在节点的Postgres:(基于此答案 )

var ta = [1,2,3,4,5];
var tas = '{' + ta.join() + '}';

...skipped over the pg connect code

client.query("select testarray($1)", [tas] ...
client.query("select testarray($1::int[])", [tas] ...
not sure about the ARRAY constructor.


文章来源: Pass array from node-postgres to plpgsql function