PL / pgSQLでクエリ結果を変数に保存する


130

PostgreSQLの手続き型言語であるPL / pgSQLの変数にクエリの結果を割り当てる方法は?

私には機能があります:

CREATE OR REPLACE FUNCTION test(x numeric)
RETURNS character varying AS
$BODY$
DECLARE
name   character varying(255);
begin
 name ='SELECT name FROM test_table where id='||x;

 if(name='test')then
  --do somthing
 else
  --do the else part
 end if;
end;
return -- return my process result here
$BODY$
LANGUAGE plpgsql VOLATILE

上記の関数では、このクエリの結果を保存する必要があります。

'SELECT name FROM test_table where id='||x;

変数にname

これを処理するには?

回答:


198

私はあなたが探していると思いますSELECT INTO

select test_table.name into name from test_table where id = x;

これは、関数の引数であるnamefrom をプルし、変数に残します。テーブル名のプレフィックスを省略しないでください。そうしないと、あいまいな参照について不満が出ます。test_tableidnametest_table.name


2
複数の変数が必要な場合はどうすればよいですか。select test_table.name、test_table.id、test_table.ssn?
Dao Lam

2
@DaoLam:私が好きなドキュメントから:「単一の行(おそらく複数の列)を生成するSQLコマンドの結果は、レコード変数、行型変数、またはスカラー変数のリストに割り当てることができます。」
muが短すぎる

@muistooshortなので、同じことができ、name.id、name.ssnを使用して取得できますか?IF EXISTSで試してみましたが機能しませんでした:IF EXISTS(*を選択してtest_tableから名前に入れます...))
Dao Lam

@DaoLamなぜINTOとIF EXISTSを組み合わせるのですか?たぶん、あなたが何をしようとしているのかを説明できるように、新しい質問をするべきでしょう。
muが短すぎる

3
そこドキュメントには例が(または私はそれを逃した)ではありませんが、@muistooshortが述べたように、あなたは、単一選択と複数の変数に選択することができますSELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x;
Grengas

78

単一の変数を割り当てる限り、plpgsql関数でプレーンな割り当てを使用することもできます。

name := (SELECT t.name from test_table t where t.id = x);

または、すでに提供されてSELECT INTOいる@muのように使用します。

これも機能します:

name := t.name from test_table t where t.id = x;

ただし、@ Pavelがコメントしたように、最初の2つの明確な方法のいずれかを使用することをお勧めします。

さらに、テーブルエイリアスを使用して構文を短くしました。
更新:私はコード例を削除し、IF EXISTS()代わりに@Pavelによって提供されるように使用することをお勧めします。


1
これは良い考えではありません-この機能は文書化されておらず、醜いです
Pavel Stehule

2
PL / pgSQLは、SQLとPLの混在を許可します-場合によっては、本当に奇妙な生き物を作成できますが、孤立したステートメントでPLとSQLをきれいに混在させる方が良いでしょう。
Pavel Stehule 2012

@PavelStehule:同意します、あなたのフォームが望ましいです。
Erwin Brandstetter 2012

実際に私はあなたの構文をprefereんが、あなたがエラーを処理ワナときに問題があり、select into文の反対でtrueにあなたの声明のdoesntの送信FOUND、チェックアウト(postgresql.org/docs/9.1/plpgsql-statements.html
SENHAJI RHAZI Hamza

18

通常のパターンはEXISTS(subselect)次のとおりです。

BEGIN
  IF EXISTS(SELECT name
              FROM test_table t
             WHERE t.id = x
               AND t.name = 'test')
  THEN
     ---
  ELSE
     ---
  END IF;

このパターンは、PL / SQL、PL / pgSQL、SQL / PSMなどで使用されます。


2

学習テーブルを作成:

CREATE TABLE "public"."learning" (
    "api_id" int4 DEFAULT nextval('share_api_api_id_seq'::regclass) NOT NULL,
    "title" varchar(255) COLLATE "default"
);

データ学習表の挿入:

INSERT INTO "public"."learning" VALUES ('1', 'Google AI-01');
INSERT INTO "public"."learning" VALUES ('2', 'Google AI-02');
INSERT INTO "public"."learning" VALUES ('3', 'Google AI-01');

ステップ:01

CREATE OR REPLACE FUNCTION get_all (pattern VARCHAR) RETURNS TABLE (
        learn_id INT,
        learn_title VARCHAR
) AS $$
BEGIN
    RETURN QUERY SELECT
        api_id,
        title
    FROM
        learning
    WHERE
        title = pattern ;
END ; $$ LANGUAGE 'plpgsql';

ステップ:02

SELECT * FROM get_all('Google AI-01');

ステップ:03

DROP FUNCTION get_all();

デモ: ここに画像の説明を入力してください


-2

次の例では、PL / pgSQLを使用してクエリ結果を変数に格納できます。

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.