2017-08-28 11 views
-1

私はnoob免責条項:PostgresSQLにPL関数のクエリ情報を使用させるにはどうすればよいですか?

私はPostgresには新しく、PL機能の限界と能力について理解していません。単純な並べ替えをしたいと思いますが、Cで最もうまくいくと思いますが、コードブロック内からデータベースからデータを取り出す方法と混同しています。私が読んだところでは、Cからデータベースへの接続を確立してからクエリを実行する必要があるようです...もっと良い方法があると思うかもしれませんが(あるいは何かが欠けていると思います) - あなたのコンテナ関数が属しているデータベースに接続するのは不必要に正式なようです。

私は何をしようとしている:template_set_id、template_set、next_template_set_id:私は、次のフィールドを持つテーブルのtemplate_setを持って

。レコードのグループは、それらが一緒に属していることを示す同じtemplate_set値を持ちます。これらのレコードを選択し、next_template_set_id値だけを使用して順番に表示させたいと考えています。簡単なことは、スタックを作成し、最後のアイテム(next_template_set_id = nullの場所)をスタックにプッシュし、次にnext_template_set_idがスタック上の最後のアイテムのIDであるアイテムを、すべてのアイテム疲れた。十分に簡単ですが、これを行うには、関数にSQLデータのセット、配列、またはタプルを取得する必要があります。私は1つの関数を取得することができますし、整形するためにAC関数のsetof template_setテーブルを返すことができますが、もし私がした場合、その関数setofは、postgres内に存在するだろうと私はAC関数に戻ることができるかどうかわからないそのようなデータを取ることができますか?)

質問:

それが属するデータベースからデータを取得するためのPostgreSQLのC関数を取得するための最良の方法は何ですか?接続とカーソルのオーバーヘッドをすべて作成せずにac関数内からデータベースを照会できますか、またはc関数を操作する必要があるすべてのデータを関数に渡す必要がありますか?あなたは複数のデータレコードを渡す)?

+0

https://www.postgresql.org/docs/9.6/static/libpq.html – joop

+0

「私はCで最もうまくいくと思う単純な並べ替えをしたい、なぜこれはできないと思いますか? SQLで行うのですか?あなたのデータの例とあなたの意図した結果を教えてください。 – joop

答えて

1

plpgsqlを除く他の言語と同様に、データベースに接続する必要があります。

行を関数に渡すことはできませんが、たとえば - jsonに変換して配列として渡すことができます。テキストに変換して同じことをすることさえできると思います。関数内で直列化を解除する必要があるので、c関数内の接続を開くよりも速いかどうかはわかりません。また、より多くのメモリを使用する可能性があります。

あなたの関数を各行ごとに1回呼び出すこともできますが、それはどのように機能するかにより、より良くなるか悪化するか、まったく機能しない可能性があります(並べ替えなど)。

SELECT my_c_func(col1, col2, col3) FROM my_table; 

私は、SPIを使用してデータベースに接続することをお勧めします。一般的な拡張機能のように(例:tablefunc

関連する問題