おそらく必要なもの
ほとんどの場合、1 つの関数が返さtext
れ、別integer
の関数が返されるか、またはboolean
成功を示すために返される関数が必要です。これはすべて些細なことであり、 SO に関する同様の質問の優れたマニュアルCREATE FUNCTION
またはコード例を参照します。
実際に質問した内容
テキストまたは整数値を返す関数の書き方
... 1 つの戻り値の型が or のいずれか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);
シンプルなケース
TRUE
行が挿入されたかどうかを示すために/を返す1 つの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
でき、他の型との間でキャストできます。