postgresql - 函数中的 for 循环无效
问题描述
我正在尝试使以下功能正常工作:
CREATE OR REPLACE FUNCTION validate_count(devices TEXT[], campaign_id INTEGER) RETURNS void AS $$
DECLARE
devices_array TEXT[] := devices;
devices_count INTEGER := array_length(devices, 1);
row_id INTEGER := campaign_id;
BEGIN
FOR device IN unnest(devices_array) LOOP
IF my_count('my_table', device, row_id) != 1;
RAISE EXCEPTION 'invalid_count %', row_id
ENDIF
END LOOP;
END
$$ LANGUAGE plpgsql;
my_count
是一个返回 INTEGER 的工作函数。
定义失败并出现错误:
ERROR: syntax error at or near "unnest"
LINE 7: FOR device IN unnest(devices_array) LOOP
你能发现问题吗?谢谢!
我打算按如下方式调用该函数:
select validate_count('{foo, bar}', 1)
解决方案
需要解决一些问题才能使其有效。
FOR
循环需要在SELECT
之前unnest
,即:
FOR device IN SELECT unnest(devices_array) LOOP
您需要在device
顶部声明,例如:
DECLARE device RECORD;
该IF
语句需要 aTHEN
而不是 a ;
,即:
IF my_count('my_table', device, row_id) != 1 THEN
该RAISE EXCEPTION
语句在行尾需要一个分号,即:
RAISE EXCEPTION 'invalid_count %', row_id;
END
for语句IF
应该是.END IF;
END
for语句LOOP
应该是.END LOOP;
这是最终结果:
CREATE OR REPLACE FUNCTION validate_count(devices TEXT[], campaign_id INTEGER) RETURNS void AS $$
DECLARE
devices_array TEXT[] := devices;
devices_count INTEGER := array_length(devices, 1);
row_id INTEGER := campaign_id;
device RECORD;
BEGIN
FOR device IN SELECT unnest(devices_array) LOOP
IF my_count('my_table', device, row_id) != 1 THEN
RAISE EXCEPTION 'invalid_count %', row_id;
END IF;
END LOOP;
END
$$ LANGUAGE plpgsql;
推荐阅读
- angular - ngModel 不能用于使用父 formGroup 指令 p-dropDown 注册表单控件(prime ng element !)
- mongodb - Mongodb 中的查询操作,在同一集合的两个查询之间从 find left outer 中查找前 10 行
- php - 将 2 个对象放入对象内部
- javascript - 滑动滑块中带有 CSS 过渡的第二张幻灯片的幻灯片闪烁
- transactions - PynamoDB TransactWrite 更新抛出 ValidationException
- sockets - Kotlin 中的 Socket.io 用于 ProtoPie Connect Bridge,每次都收到相同的数据
- sql - Postgres - 如何使用 UNION ALL 实现 UNION 行为?
- scala - mapGroupsWithState 中 eventTimeTimeout 和 processingTimeTimeout 的区别
- angular - 将对象中的文本更改为新键打字稿
- android - 如何在没有消息的情况下发送电子邮件意图?