2

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 を返すバリエーションを探します。

Postgres parse-array の問題と、node-postgres のパラメーター化された配列に関するこのスタックオーバーフローの質問について読みました。

しかし、答えはそこにはなかったようです。

4

3 に答える 3

3

パラメータは、次のいずれかの形式である必要があります。

'{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()2 つのパラメーターarray_upper()が必要です。2番目は配列の次元です-あなたの場合。1

于 2012-11-11T02:27:13.953 に答える
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 引用の tl:dr

node-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.
于 2012-11-11T07:32:59.640 に答える
-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);
});
于 2012-11-11T02:26:05.750 に答える