Return INSERT 函数的输出
Return INSERT output from a function
当执行 INSERT
时 its 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 语言,其中所有信息都可用。
当执行 INSERT
时 its 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 语言,其中所有信息都可用。