postgresql - 带有 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 语句
解决方案
使用一个简单的 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;
推荐阅读
- c# - 验证 Web api 控制器是否需要以编程方式授权
- c - 找不到从 linux 入口点交叉编译的 windows curl_easy_cleanup 找不到
- r - R中缺失值的线性插值
- android - ViewModel 可以实现 LifecycleOwner 吗?
- typescript - 自引用类型 - 有可能吗?
- laravel - 为什么我不能将输入请求中的空字符串直接保存到相应的会话变量中?
- python - 查找最大值子数组的索引并将其应用于该子数组
- java - 将 dat 转换为链表
- java - 多次运行测试方法而不使用循环
- r - 如何找到在 R 中产生最大 colMeans 的集群?