164

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

これを処理する方法は?

4

6 に答える 6

244

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

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

これにより、関数の引数はどこnameから取得され、変数に残されます。テーブル名のプレフィックスを省略しないでください。省略すると、参照があいまいであるという苦情が寄せられます。test_tableidnametest_table.name

于 2012-09-08T05:29:10.637 に答える
104

単一の変数を割り当てるには、PL / pgSQLコードブロックでプレーンな割り当てを使用し、右側にスカラーサブクエリを設定することもできます。

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

SELECT INTOすでに提供されている@muと実質的に同じですが、微妙な違いがあります。

  • SELECT INTOPostgres 14での私のテストでは、わずかに高速です
    (定数の単純な割り当ては、関与せずにSELECT、それでも10倍高速です。)
  • SELECT INTOまた、特別な変数FOUNDを設定しますが、単純な割り当ては設定しません。どちらか一方が必要な場合があります。
  • SELECT INTO一度に複数の変数を割り当てることもできます。見る:

特に、これも機能します。

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

先頭のSELECTないステートメントSELECT。しかし、私はこのハイブリッドを使用しません。@Pavelがコメントしたように、最初の2つの、より明確で文書化された方法の1つを使用することをお勧めします。

于 2012-09-08T07:14:47.780 に答える
20

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

于 2012-09-08T18:52:54.090 に答える
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();

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

于 2017-05-08T09:35:16.350 に答える
0

単一行の結果を使用してクエリを実行するには、次の構文を使用します。

SELECT select_expressions INTO [STRICT] target FROM ...

ここtargetで、レコード変数、行変数、または単純変数とレコード/行フィールドのコンマ区切りリストを指定できます。

とは異なり、SELECT INTOテーブルSELECT select_expressions INTOを作成しません。

この例では、単純な変数が1つあるnameため、selectステートメントは次のようになります。

SELECT test_table.name INTO name FROM test_table WHERE test_table.id = x;
于 2021-04-15T11:54:40.917 に答える
-1

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

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
于 2018-10-08T12:35:34.977 に答える