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

标签 sql postgresql transactions sql-insert

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

相关文章:

mysql - 如何拥有一个包含多个主键的表?

PHP(SQL) 选择名称,其中 id = 更多值

sql - 如何按关系计数对结果进行分组

postgresql - LOGSTASH:如何设置Logstash以获取所有查询的数据而不仅仅是其中的一部分?

html - -o-转换 : margin 200ms ease-out not working in windows machine

php - 使用 PHP 获取和存储信用卡信息的最佳实践

android - 如何从 SQLite 数据库中检索图像?

postgresql - 如何在postgreSQL中出现异常后重试事务

postgresql - CloudWatch 中的多个日志流 - PostgreSQL RDS

java - Kettle在java函数中启动改变系统属性