plpgsql函数:
CREATE OR REPLACE FUNCTION testarray (int[]) returns int as $$
DECLARE
len int;
BEGIN
len := array_upper($1);
return len;
END
$$ language plpgsql;
node-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);
});
节点服务器的输出:
错误:错误:数组值必须以“{”或维度信息
开头 结果:未定义
我还尝试在testarray($1::int[])
等客户端查询中转换参数,返回相同的错误。
我将函数参数更改为(anyarray int)
并且输出错误已更改:
错误:错误:整数的输入语法无效:“1,2,3,4,5”
结果:未定义
以及其他一些变体。
我寻找不会产生错误并且返回5的变体。
我在node-postgres中读到有关参数化数组的Postgres parse-array issue和此stackoverflow问题:
但答案似乎并不存在。
答案 0 :(得分:2)
参数必须采用以下形式之一:
'{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()
可以满足您的需求。相关问题:
array_length()
和array_upper()
都需要两个参数。第二个是数组维度 - 在您的情况下为1
。
答案 1 :(得分:0)
根据您发布的答案,这可能对您有用:
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);
});
答案 2 :(得分:0)
感谢PinnyM和Erwin的回应。我查看了选项并重新阅读了相关答案。
Erwin描述的数组格式在node-postgres中按字面意思如下:
'select testarray(' + "'{1,2,3,4,5}'" + ')'
'select testarray(' + "'{1,2,3,4,5}'" + '::INT[])'
'select testarray(ARRAY[1,2,3,4,5])'
javascript quoting的tl:dr
在node-postgres中对它们进行参数化: (基于this answer)
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.