当我在 begin;
和 commit;
事务中有两个 INSERT
SQL 语句(见下文)时,RETURNING *
不返回任何内容,但如果我取出 begin;
和 commit;
RETURNING *
会返回插入的记录。< br/>
我怎样才能让 RETURNING *
在事务中工作?
BEGIN;
INSERT INTO gis_field_configuration
(level_unique_name, level_name_caption, use_for_charts, use_as_displayby,
displayby_label, data_type, level_help_text)
VALUES (
'[john].[john]',
'john',
'false',
'false',
'',
'text',
'help text'
);
INSERT INTO gis_field_configuration_bycube
(cube, level_unique_name)
VALUES (
'Instruments',
'[john].[john]'
) RETURNING *;
COMMIT;
最佳答案
一种方法是使用 data-modifying CTE并将两个 INSERT
打包成一个命令。需要 PostgreSQL 9.1 或更高版本:
WITH x AS (
INSERT INTO gis_field_configuration (level_unique_name, level_name_caption
,use_for_charts, use_as_displayby, displayby_label, data_type
,level_help_text)
VALUES (
'[john].[john]',
'john',
'false',
'false',
'',
'text',
'help text'
)
)
INSERT INTO gis_field_configuration_bycube
(cube, level_unique_name)
VALUES (
'Instruments',
'[john].[john]'
)
RETURNING *;
但是,在任何情况下,您确实使用RETURNING *
取回值。只需在 发送 COMMIT
之前阅读它们。作为批处理发送,仅返回 last
命令的结果 - 如果您将 所有 命令作为一个命令发送,这将是 COMMIT
的结果批处理。
暂停 COMMIT;
,直到您收到第二个 INSERT
的结果。
在 plpgsql 函数中
函数在事务中自动运行。您不需要明确的 BEGIN/COMMIT。要重用从 INSERT
返回的值,请使用 RETURNING *expressions* INTO [STRICT] *target*
.
考虑这个简单的演示:
CREATE TABLE foo (foo_id serial, bar text);
CREATE OR REPLACE FUNCTION f_foo()
RETURNS void LANGUAGE plpgsql AS
$BODY$
DECLARE
<b>foo_var foo;</b> -- type name = table name, fits return type of RETURNING *
-- or use a generic type record
BEGIN
INSERT INTO foo (bar)
VALUES ('baz')
RETURNING *
<b>INTO foo_var;</b>
RAISE NOTICE 'New id is: %', <b>foo_var.foo_id</b>;
-- do stuff with foo_var
END;
$BODY$;
SELECT f_foo();
关于sql - 从事务中的 RETURNING * 获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12463846/