2

plpgsql関数には、record型の変数があります。

my_rec RECORD;

このレコードには任意のテーブルの行が含まれているため、実行される前に列がわかりません。ただし、varcharとして使用できる列の少なくとも1つの名前はあります。

問題は、my_recから特定の列の値を取得するにはどうすればよいですか?

4

2 に答える 2

2

関数内の動的列を使用hstoreしてsを操作するために使用します。recordPL/PgSQL

CREATE EXTENSION hstore;

CREATE OR REPLACE FUNCTION test_fn(col_name text) RETURNS text AS $$
DECLARE 
  input_row record;
  col_value text;
BEGIN
  SELECT INTO input_row 
    * 
  FROM ( VALUES ('a','b','c',1) ) AS dummyrow(col1,col2,col3,intcol);

  SELECT INTO col_value
    hstore(input_row) -> col_name;

  RETURN col_value;
END;
$$ LANGUAGE 'plpgsql';

hstoreは拡張機能ですが、8.3以降PostgreSQLにバンドルされておりCREATE EXTENSION、9.1以降を使用してインストールできる拡張機能です。レコードからストアへの変換は、8.4や9.0などからサポートされています。

于 2012-10-17T22:40:46.800 に答える
1

plpgsqlでこれを行う方法がわかりません。私はあなたのために少しテストを行い、次のような「EXECUTESELECT」ソリューションを機能させようとしました。

 EXECUTE 'select $1.' || quote_ident(the_param) USING my_rec INTO my_var;

これは私には機能せず、次のようになります。

 could not identify column "{{param_value here}}" in record data type

これは、 plpgsqlでは不可能であるという数年前の非常によく似た質問です。それが示唆しているように、それは他のいくつかの言語で可能であるはずです。トムレーンの答えを引用する:

plpgsqlでそれを行う方法はありません。他のPL(plperl、pltclなど)はplpgsqlほど強く型付けされていないため、これを行うことができます。

于 2012-10-17T14:24:16.197 に答える