2017-06-07 1 views
0

複数のテーブルから作成したビューからすべての行をフェッチするのに数時間かかることがあります。複数のテーブルビューからカーソルを取得するPostgreSQL

Iは、それぞれ対応する2つのカスタム複合型二つのテーブル(位置、ベクトル)に、type_positiontype_vector

位置(ID、SYS_TIME、緯度、経度)

を有しますベクトル(id、sys_time、speed)

plpgsqlプロシージャで一時的なVIEWを作成してすべてをまとめようとしています。

CREATE TEMP VIEW posAndVectView AS 
        SELECT * from position 
        UNION ALL 
        SELECT * from vector; 

が、私は、このビューを反復処理する必要があり、いくつかの作業が位置に依存し、ベクトル属性を作っ:SYS_TIMEによる位置とベクトルと注文彼らはので、私は書いています。

DECLARE 
manyRows refcursor; 
BEGIN 

OPEN manyRows FOR 
SELECT * FROM posAndVectView ORDER BY sys_time ASC; 
LOOP 
FETCH manyRows INTO posOrVect; 
EXIT WHEN NOT FOUND; 
... 
END LOOP; 
CLOSE manyRows; 

だから、私の質問はposOrVect変数の型は、DECLAREセクションで何をする必要がありますされています

はので、私は、カーソルを使用すべきだと思いますか?

答えて

1

私はそれがかなり簡単な答えを見つけました。 Iは、PostgreSQL documentationにmentionnedそのようレコードタイプとposOrVect変数を宣言する必要があります

レコード変数は変数型の行に類似しているが、それらは 事前定義された構造を有していません。それらは行の実際の行構造をとる SELECTまたはFORコマンドの間に割り当てられます。 の下位構造は、レコード変数が割り当てられるたびに変更されます。 A この結果、レコード変数が最初に に割り当てられるまで、サブストラクチャはなく、 のフィールドにアクセスしようとすると実行時エラーが発生します。

1

シンプル...時々type_vector、時々type_positionのようです。タイプはposAndVectViewである必要があります。

他のテーブルと同様に、一時テーブルと同じ名前の複合タイプもあります。

ただし、ビューが必要ですか? UNIONを使用してクエリのカーソルを開くことができます。その場合は、最初のテーブルであるため、タイプpositionを使用します。

+0

私はビューが実際にBEGINセクションで作成される前に、自分のビューに対応する型がDECLAREセクションで認識されていることを意味します。私はそれをテストします。 – Doremus

+0

posAndVectViewとposAndVectView%ROWTYPEを使って、DECLAREセクションのposOrVect変数を宣言しようとしましたが、posAndVectView型が不明なので、ビューがまだ作成されていないためにエラーが発生することが予想されます。 – Doremus

+0

あなたは正しいです。関数自体の内部で一時的なビューを作成することができませんでした。 'record'を使うことは良い解決策です。しかし、私が言及したように、私はあなたが本当にこれのためのビューを必要とは思わない。 –

関連する問題