0

PL/pgSQL 関数内で PostgreSQL の SQL 出力フォーマットを活用したいと思っていますが、その考えをあきらめなければならないと感じ始めています。

PL/pgSQL関数がありますquery_result

CREATE OR REPLACE FUNCTION query_result(
    this_query text
) RETURNS SETOF record AS  
$$
    BEGIN
      RETURN QUERY EXECUTE this_query;
    END;
$$ LANGUAGE plpgsql;

SETOF..入力テキスト クエリから喜んでレコードを返します。これを動的クエリを使用した SQL スクリプトに使用できます。

mydb=# SELECT * FROM query_result('SELECT ' || :MYVAR || ' FROM Alice') AS t (id int);
 id 
----
  1
  2
  3

したがって、私の希望は、代わりに PL/pgSQL 関数内からこの同じきれいにフォーマットされた出力を提供する方法を見つけることでしたが、型をサポートしておらず、レコードからテキストへの魔法の定義済みキャストはありません(私は自分自身を作成できることを知っています.. )RAISESETOFSETOFCAST

ダミーprint_result関数を作成すると:

CREATE OR REPLACE FUNCTION print_result(
    this_query text
) RETURNS void AS 
$$
    BEGIN
      SELECT query_result(this_query);                                                                                                                                   
    END;
$$ LANGUAGE plpgsql;

..書式設定された出力を印刷できません:

mydb=# SELECT print_result('SELECT ' || :MYVAR || ' FROM Alice');
ERROR:  set-valued function called in context that cannot accept a set
...

提案をありがとうございます(PostgreSQL 8.4で動作することが望ましいです)。

4

1 に答える 1

1

OK、結果セットで何かを行うには、print_resultそれをループする必要があります。それは次のようになります -

ここでresult_recordは変数として定義されていrecordます。説明のために、書式設定された結果を保持するために空白文字列として定義され、デフォルトで設定されているformatted_results変数があると仮定します。text

FOR result_record IN SELECT * FROM query_result(this_query) AS t (id int) LOOP
    -- With all this, you can do something like this
    formatted_results := formatted_results ||','|| result_record.id;
END LOOP;

RETURN formatted_results;

したがって、print_resultsテキストを返すように変更し、説明したように変数を宣言してこれを追加すると、関数はすべての結果のコンマ区切りリストを返します (最後に余分なコンマを付けてください。 PostgreSQL の文字列関数を使用してそれをトリミングします)。これがまさにあなたが望むものかどうかはわかりませんが、これにより、結果セットを操作する方法についての良いアイデアが得られるはずです. 制御構造についての詳細は、ここで入手できます。これにより、ほとんど何でも実行できるはずです。

本当の質問に答えるために編集してください:

データ タプルを読み取り可能なテキストとしてフォーマットする機能は、PostgreSQL サーバーではなく、psql クライアントの機能です。この機能をサーバーで使用できるようにするには、関連するコードまたはモジュールを psql ユーティリティから抽出し、それらをデータベース関数として再コンパイルする必要があります。これは可能だと思われます (また、誰かが既にこれを行っている可能性もあります) が、私はその方法を適切に説明できるほどプロセスに精通していません。ほとんどの場合、クエリ結果をテキストとしてフォーマットするための最善の解決策は、PostgreSQL の文字列フォーマット関数を利用して、アプリケーションに必要な機能を実装することです。

于 2013-06-21T15:19:53.700 に答える