ホームページ > データベース > mysql チュートリアル > PL/pgSQL 関数はどのようにしてさまざまな SELECT クエリから結果を動的に返すことができるのでしょうか?

PL/pgSQL 関数はどのようにしてさまざまな SELECT クエリから結果を動的に返すことができるのでしょうか?

DDD
リリース: 2025-01-22 23:31:12
オリジナル
605 人が閲覧しました

How Can a PL/pgSQL Function Dynamically Return Results from Various SELECT Queries?

PL/pgSQL 関数をリファクタリングして、さまざまな SELECT クエリの出力を返す

動的 SQL と戻り値の型

未定義のタイプのレコードを返します

元の関数はテキストの戻り値の型を宣言しましたが、今回の目標は、生成された 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート