首页 > 解决方案 > 带有 INSERT 的 PosgreSQL 函数... RETURNING 使查询没有结果数据的目的地

问题描述

我已经看到很多关于相同错误消息的问题,但我找不到具有相同用例的问题。下面是我的架构。我基本上需要我的函数来返回插入表中的整个记录base.batch​​。请注意,我希望稍后使用 Postgraphile 调用此函数。参照。我在这里使用的自定义突变示例

CREATE SCHEMA base;

CREATE TABLE base.indicator_group (
    id SERIAL PRIMARY KEY,
    indicator_group TEXT NOT NULL UNIQUE,
    created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO base.indicator_group (indicator_group) VALUES ('test');

CREATE TABLE base.batch (
    id SERIAL PRIMARY KEY,
    status TEXT NOT NULL,
    created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    indicator_group_id INTEGER NOT NULL REFERENCES base.indicator_group(id)
);

CREATE OR REPLACE FUNCTION base.execute_indicator_group(id integer)
RETURNS base.batch AS $$
BEGIN
    INSERT INTO base.batch (status, indicator_group_id) VALUES ('Pending', 1)
    RETURNING *;
END;
$$ LANGUAGE plpgsql VOLATILE STRICT SECURITY DEFINER;

我正在调用如下函数:

select base.execute_indicator_group(1);

它返回错误:

错误:查询没有结果数据的目的地 上下文:PL/pgSQL 函数 base.execute_indicator_group(integer) 第 3 行在 SQL 语句

标签: postgresqlfunctionreturnplpgsql

解决方案


使用一个简单的 SQL 函数:

CREATE OR REPLACE FUNCTION base.execute_indicator_group(id integer)
RETURNS base.batch AS $$
    INSERT INTO base.batch (status, indicator_group_id) VALUES ('Pending', 1)
    RETURNING *;
$$ LANGUAGE sql STRICT SECURITY DEFINER;

FROM子句中使用它:

SELECT * FROM base.execute_indicator_group(1);

 id | status  |        created_date        |        updated_date        | indicator_group_id 
----+---------+----------------------------+----------------------------+--------------------
  1 | Pending | 2018-08-06 23:43:15.076431 | 2018-08-06 23:43:15.076431 |                  1
(1 row)

在 plpgsql 函数中(如果您想在函数内另外执行其他操作),您需要一个变量:

CREATE OR REPLACE FUNCTION base.execute_indicator_group(id integer)
RETURNS base.batch AS $$
DECLARE
    result base.batch;
BEGIN
    INSERT INTO base.batch (status, indicator_group_id) VALUES ('Pending', 1)
    RETURNING *
    INTO result;
    RETURN result;
END;
$$ LANGUAGE plpgsql VOLATILE STRICT SECURITY DEFINER;

推荐阅读