gpt4 book ai didi

sql - 从事务中的 RETURNING * 获取值

转载 作者:行者123 更新时间:2023-11-29 11:19:37 25 4
gpt4 key购买 nike

当我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com