クエリの結果を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
に。
これを処理する方法は?
あなたが探していると思う SELECT INTO
:
select test_table.name into name from test_table where id = x;
それはtest_table
からname
を引き出します。ここでid
は関数の引数で、name
変数に残します。 test_table.name
のテーブル名のプレフィックスを省略しないでください。曖昧な参照について苦情が発生します。
単一の変数を割り当てる限り、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()
を使用することを提案しました。
通常のパターンは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などで使用されます...
学習テーブルを作成します。
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();
次の例を使用して、PL/pgSQLを使用してクエリ結果を変数に保存できます。
select * into demo from maintenanceactivitytrack ;
raise notice'p_maintenanceid:%',demo;