5

PostgreSQL 9.2.4 を使用しています。

postgres=# select version();

                           version
-------------------------------------------------------------
 PostgreSQL 9.2.4, compiled by Visual C++ build 1600, 64-bit
(1 row)

sqlfiddle リンク

私のクエリは挿入を安全に実行します。必要なのは、関数が void データ型以外の何かを返す必要があることです。text("inserted into table") や integer(0-false,1-true) のようなものは、挿入されているかどうかを検証するのに役立ちますか?

挿入が完了したときにanintegerまたは aを返す関数の構文が必要です。text検証目的のため。これを解決する方法はありますか?

4

3 に答える 3

5

おそらく必要なもの

ほとんどの場合、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でき、他の型との間でキャストできます。

于 2013-07-11T23:16:14.133 に答える
0

関数は 1 つの型のみを返すことができます。あなたの場合、1 つの整数と 1 つのテキストの 2 つのフィールドを持つ複合型を作成し、それを返すことができます。

于 2013-07-11T13:20:50.420 に答える