从函数返回INSERT输出

时间:2019-06-05 20:42:32

标签: sql postgresql plpgsql

在执行its output is a command tag {{3}}时,例如INSERT

我想从函数内部捕获相同的命令标签并返回它。

我认为INSERT 0 1子句会对我有所帮助,但是它的工作原理类似于对插入的行进行RETURNING查询,并返回一个类似表的集合。我不要那个。 我想要的是返回执行SELECT时得到的普通命令标记(即文本“ INSERT 0 1”)。

这是我要实现的目标的伪代码示例(当然,INSERT在这种情况下不起作用,因为RETURN QUERY是非SETOF函数中的

INSERT

我如何实现我所需要的?

3 个答案:

答案 0 :(得分:2)

INSERT使用CTE:

WITH i as (
      INSERT INTO users (username)
          VALUES (p_username)
      RETURNING *
     )
SELECT i.*
FROM i;

答案 1 :(得分:2)

命令标签“ INSERT 0 1”不可直接用于plpgsql环境。您可以通过GET DIAGNOSTICS命令以不同的格式获取相同的信息。

DO $$
  DECLARE _oid oid; _rc bigint;
BEGIN
  INSERT INTO foo VALUES(10);
  GET DIAGNOSTICS _oid = RESULT_OID; -- it is not supported on 12+
  GET DIAGNOSTICS _rc = ROW_COUNT;
  RAISE NOTICE 'INSERT % %', _oid, _rc;
END;
$$;

如果需要更多,则应该使用与PLpgSQL不同的语言-特殊的变体是C语言,其中提供了所有信息。

答案 2 :(得分:1)

您不能从字面上捕获消息INSERT 0 1,因为它不是INSERT语句返回的,而是由psql命令行工具根据INSERT的状态生成的声明。

因此,如果您想查看该消息,则需要在函数中自行生成该消息(此操作不需要PL / pgSQL):

CREATE FUNCTION insert_user_test (p_username text)
    RETURNS text
    LANGUAGE SQL
  AS $$
    with inserted as (
      INSERT INTO users(username) values(p_username))
      returning *
    )
    select concat('INSERT 0 ', count(*))
    from inserted;
  $$;

如果您不想看到消息INSERT 0 1,则可以直接返回用户名:

CREATE FUNCTION insert_user_test (p_username text)
    RETURNS text
    LANGUAGE SQL
  AS $$
      INSERT INTO users(username) values(p_username))
      returning username;
  $$;

或包含已插入的默认值的完整行:

CREATE FUNCTION insert_user_test (p_username text)
    RETURNS setof users
    LANGUAGE SQL
  AS $$
      INSERT INTO users(username) values(p_username))
      returning *;
  $$;