テーブルの内容をPL/PGSQLの多次元配列に具体化しようとしています。
(「ネイバー」とは何か疑問に思っている人のために:テーブルwnodeとwedgeは、ノードwnode
とエッジを持つグラフを定義しますwedge
。ここで、ノードvのネイバーをに含まれる配列に格納しneighbors[v]
ます)。
これは私がこれまでに行ったことです:
DECLARE
neighbors INTEGER[][];
v INTEGER;
BEGIN
FOR v IN SELECT n_id FROM wnode LOOP
SELECT ARRAY ( SELECT n2_id FROM wedge WHERE n1_id=v) INTO neighbors[v];
END LOOP;
RETURN neighbors;
上記のコードは、構文エラーが原因で失敗します。
ROW 7: ...( SELECT n2_id FROM wedge WHERE n1_id=v) INTO neighbors[v];
^
次に試したのは、バッキング変数を導入することでしたtmp
。
DECLARE
neighbors INTEGER[][];
v INTEGER;
tmp INTEGER[];
BEGIN
FOR v IN SELECT n_id FROM wnode LOOP
SELECT ARRAY ( SELECT n2_id FROM wedge WHERE n1_id=v) INTO tmp;
neighbors[v] := tmp;
END LOOP;
RETURN neighbors;
END
このランタイムエラーが発生しました:
ERROR: invalid input syntax for integer: »{140,153,290,360,393}«
私も使ってみSELECT array_append(neighbors, tmp) INTO neighbors;
ましたがうまくいきませんでした。
私は今アイデアがありません。次に試すのは、繰り返してtmp
各値を割り当てることですneighbors[v][i] := tmp[i];
...あまりエレガントではありません。
多次元配列をよりエレガントな方法で埋める方法を知りたいですか?(たぶん、単一のSQLクエリのみを使用することで可能ですか?)
ご協力いただきありがとうございます。:-)
編集:スキーマ