Return INSERT 函数的输出

Return INSERT output from a function

当执行 INSERTits output is a command tag,例如INSERT 0 1.

我想从函数内部捕获相同的命令标记并return它。

我认为 RETURNING 子句对我有帮助,但它的工作方式类似于对插入行的 SELECT 查询,returning 一个类似于 table 的集合.我不要那个。 我想要的是 return 执行 INSERT 时得到的普通命令标记 (即文本“INSERT 0 1”)。 =21=]

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

CREATE FUNCTION insert_user_test (
    p_username text)
    RETURNS text
    LANGUAGE plpgsql
    AS $$
BEGIN
    RETURN QUERY INSERT INTO users(username) values(p_username));
END $$;

如何实现我的需求?

使用 CTE INSERT:

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

您无法按字面意思捕获消息 INSERT 0 1,因为它不是由 INSERT 语句 return 编辑的,而是由基于 psql 命令行工具生成的]status 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 那么您可以 return 用户名代替:

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 *;
  $$;

命令标记 "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 语言,其中所有信息都可用。