You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用含uuid类型复合数组参数的PostgreSQL存储过程报错求助

PostgreSQL自定义复合类型数组作为存储过程入参报错解决方案

问题根因

报错核心原因是存储过程内的FOR循环遍历逻辑错误:使用SELECT UNNEST(customer_items)时,返回的结果集每一行是包含单个item类型字段的行记录,直接将整行赋值给b item变量时,PostgreSQL会尝试把行输出字符串直接匹配第一个uuid字段,最终触发格式错误。

解决方案

1. 优先修改存储过程循环逻辑(推荐两种写法)

写法A:使用FOREACH直接遍历数组(性能最优,无需调用unnest)

PostgreSQL原生支持FOR循环直接遍历数组,替换原有循环块即可:

FOREACH b IN ARRAY customer_items
LOOP
    RAISE NOTICE 'b.sku_reference_id: %', b.sku_reference_id; 
    RAISE NOTICE 'b.quantity: %', b.quantity;
    INSERT INTO item_table(SKU_REFERENCE_ID, QUANTITY) VALUES(b.sku_reference_id, b.quantity);
END LOOP;

写法B:修正unnest查询逻辑

如果要保留unnest用法,修改查询语句取子字段:

FOR b IN SELECT * FROM UNNEST(customer_items)
LOOP
    RAISE NOTICE 'b.sku_reference_id: %', b.sku_reference_id; 
    RAISE NOTICE 'b.quantity: %', b.quantity;
    INSERT INTO item_table(SKU_REFERENCE_ID, QUANTITY) VALUES(b.sku_reference_id, b.quantity);
END LOOP;

2. 可选优化调用写法

你之前的3种调用写法本身语法没有问题,修改存储过程后都可正常运行,也可以使用更简洁的调用方式:

CALL dbo.sp_test_script(
    'username',
    ARRAY[
        ('e3903331-ce0b-4bd5-a853-ec7aa725a812', 20)::item,
        ('ccbecc39-11bd-4bc4-97d6-7e2f981d30dd', 40)::item
    ],
    0
);

兼容性说明

修改后的逻辑完全兼容PostgreSQL 13.3版本,可直接在AWS RDS环境运行,调用后可正确打印字段值并插入临时表。

内容的提问来源于stack exchange,提问作者CODI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:36:02