在执行its output is a command tag {{3}}时,例如INSERT
。
我想从函数内部捕获相同的命令标签并返回它。
我认为INSERT 0 1
子句会对我有所帮助,但是它的工作原理类似于对插入的行进行RETURNING
查询,并返回一个类似表的集合。我不要那个。 我想要的是返回执行SELECT
时得到的普通命令标记(即文本“ INSERT 0 1
”)。
这是我要实现的目标的伪代码示例(当然,INSERT
在这种情况下不起作用,因为RETURN QUERY
是非SETOF函数中的
INSERT
我如何实现我所需要的?
答案 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 *;
$$;