当我在INSERTbegin;事务中有两个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/

10-11 20:11