如何编写返回文本或整数值的函数?

09Q*_*534 5 postgresql types plpgsql postgresql-9.2

我正在使用 PostgreSQL 9.2.4。

postgres=# 选择版本();

                           version
-------------------------------------------------------------
 PostgreSQL 9.2.4, compiled by Visual C++ build 1600, 64-bit
(1 row)
Run Code Online (Sandbox Code Playgroud)

sqlfiddle 链接

我的查询安全地执行插入。我需要的是我的函数应该返回除 void 数据类型之外的内容。像 text("inserted into table") 或 integer(0-false,1-true) 之类的东西,验证是否插入对我有用?

我需要一个在插入完成时返回 aninteger或 a的函数的语法text。用于验证目的。有没有办法解决这个问题?

Erw*_*ter 5

你可能需要什么

很可能您需要一个函数返回text,另一个函数返回,integer或者一个返回boolean指示成功的函数。所有这些都是微不足道的,我会在关于 SO 的类似问题中向您推荐优秀的手册CREATE FUNCTION代码示例

你实际上问的是什么

如何编写返回文本或整数值的函数?

...从某种意义上说,我们有一个返回类型是textor 或integer。不像所建议的那样微不足道,但也并非不可能。关键词是:多态类型

建立在这个简单的表上:

CREATE TABLE tbl(
  tbl_id int,
  txt    text,
  nr     int
);
Run Code Online (Sandbox Code Playgroud)

此函数返回整数或文本(或任何其他类型,如果您允许),具体取决于输入类型。

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;
Run Code Online (Sandbox Code Playgroud)

称呼:

SELECT f_insert_data(1, 'foo'::text);  -- explicit cast needed.
SELECT f_insert_data(1, 7);
Run Code Online (Sandbox Code Playgroud)

简单案例

一个返回TRUE/FALSE以指示是否已插入行的函数,只有一个不同类型的输入参数:

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;
Run Code Online (Sandbox Code Playgroud)

text大多数情况下,输入类型可以用参数替换,参数可以转换为任何其他类型。