おそらく必要なもの
ほとんどの場合、text
を返すために1つの関数が必要です もう1つはinteger
を返します またはboolean
を返す関数 成功を示すために。これはすべて些細なことであり、CREATE FUNCTION
に関する優れたマニュアルを参照します。 またはSOに関する同様の質問のコード例。
実際に質問したこと
テキストまたは整数値を返す関数を作成するにはどうすればよいですか?
...1つあるという意味で 戻り値のタイプはtext
のいずれかです またはinteger
。ささいなことではありませんが、提案されているように不可能でもありません。キーワードは次のとおりです。多形型 。
この単純なテーブルに基づいて構築する:
CREATE TABLE tbl(
tbl_id int,
txt text,
nr int
);
この関数は、入力タイプに応じて、整数またはテキスト(または許可されている場合は他のタイプ)を返します。
CREATE FUNCTION f_insert_data(_id int, _data anyelement, OUT _result anyelement)
RETURNS anyelement AS
$func$
BEGIN
CASE pg_typeof(_data)
WHEN 'text'::regtype THEN
INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data)
RETURNING txt
INTO _result;
WHEN 'integer'::regtype THEN
INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data)
RETURNING nr
INTO _result;
ELSE
RAISE EXCEPTION 'Unexpected data type: %', pg_typeof(_data)::text;
END CASE;
END
$func$
LANGUAGE plpgsql;
電話:
SELECT f_insert_data(1, 'foo'::text); -- explicit cast needed.
SELECT f_insert_data(1, 7);
シンプルなケース
1つ TRUE
を返す関数 / FALSE
行が挿入されたかどうかを示すために、さまざまなタイプの1つの入力パラメーターのみ:
CREATE FUNCTION f_insert_data2(_id int, _data anyelement)
RETURNS boolean AS
$func$
BEGIN
CASE pg_typeof(_data)
WHEN 'text'::regtype THEN
INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data);
WHEN 'integer'::regtype THEN
INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data);
ELSE
RAISE EXCEPTION 'Unexpected data type: >>%<<', pg_typeof(_data)::text;
END CASE;
IF FOUND THEN RETURN TRUE;
ELSE RETURN FALSE;
END IF;
END
$func$
LANGUAGE plpgsql;
入力タイプはtext
に置き換えることができます ほとんどの目的でパラメータ。他のタイプとの間でキャストできます。