当我在INSERT
和begin;
事务中有两个commit;
SQL语句(见下文)时,RETURNING *
不返回任何内容,但是如果我取出begin;
和commit;
,则RETURNING *
确实返回插入的记录。
如何获得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
foo_var foo; -- type name = table name, fits return type of RETURNING *
-- or use a generic type record
BEGIN
INSERT INTO foo (bar)
VALUES ('baz')
RETURNING *
INTO foo_var;
RAISE NOTICE 'New id is: %', foo_var.foo_id;
-- do stuff with foo_var
END;
$BODY$;
SELECT f_foo();
关于sql - 在交易中从RETURNING *获取值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12463846/