web-dev-qa-db-ja.com

PL / pgSQLを使用してクエリ結果を変数に保存する

クエリの結果を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に。

これを処理する方法は?

97
Sathish

あなたが探していると思う SELECT INTO

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

それはtest_tableからnameを引き出します。ここでidは関数の引数で、name変数に残します。 test_table.nameのテーブル名のプレフィックスを省略しないでください。曖昧な参照について苦情が発生します。

144
mu is too short

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

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

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

これも機能します:

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

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

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

59

通常のパターンは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などで使用されます...

16
Pavel Stehule

学習テーブルを作成します。

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();

デモ:enter image description here

1
Ram Pukar

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

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
0
rinku Choudhary