未定義のタイプのレコードを返します
元の関数はテキストの戻り値の型を宣言しましたが、今回の目標は、生成された SQL ステートメントを実行し、結果をレコードとして返すことです。これを行うには、動的 SQL を使用し、まだ定義されていないタイプのレコードを返す処理を行う必要があります。
数値およびデータ型の可変性を持つカスタム型
1 つのアプローチは、列数が固定されているがデータ型が可変であるカスタムの戻り値の型を作成することです。ただし、これには呼び出しごとに列定義のリストを定義する必要があり、列名とデータ型が事前に分からない場合は現実的ではありません。
ポリモーフィック型を使用する
pg_typeof() テーブル名をオブジェクト識別子のタイプ (regtype) として返します。自動的にテキストに変換されると、識別子は自動的に二重引用符で囲まれ、パターン修飾されるため、SQL インジェクションが防止されます。
クエリの実行を返す
動的 SQL を実行して行を返す推奨方法は、RETURN QUERY EXECUTE です。これにより、SQL クエリを実行し、結果を明確に定義された行タイプの行セットとして返すことができます。
コード例
テーブル タイプ パラメータに基づいてテーブルのすべての列を返したいとします。
<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_tbl_type anyelement, _id int) RETURNS SETOF anyelement LANGUAGE plpgsql AS $func$ BEGIN RETURN QUERY EXECUTE format(' SELECT * FROM %s -- 自动用双引号括起来并进行模式限定 WHERE id = ORDER BY datahora' , pg_typeof(_tbl_type)) USING _id; END $func$;</code>
使用法
最初のパラメータとしてテーブル タイプ、2 番目のパラメータとして ID を使用してこの関数を呼び出します。この関数は、指定されたテーブル内の指定された ID を持つレコードのすべての列を返します。
<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17); -- 将pcdmet替换为任何其他表名。</code>
以上がPL/pgSQL 関数はどのようにしてさまざまな SELECT クエリから結果を動的に返すことができるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。