PostgreSQL调用plpgsql函数报column reference "list" is ambiguous错误求助
报错根因
这个错误是因为在INSERT ... ON CONFLICT DO UPDATE的SQL解析上下文中,没有加限定前缀的list标识符存在歧义:PostgreSQL无法确定你要取的是orders_summary表中冲突行的原有list字段值,还是其他上下文的同名对象。你添加的#variable_conflict use_column是plpgsql层面的配置,仅用于解决plpgsql变量与表列同名时的冲突,无法处理SQL语句内部的标识符歧义问题。
修复方案
给所有DO UPDATE子句中引用的原表字段加上表名前缀orders_summary.,明确指定引用来源即可:
ARRAY_APPEND(list, input_list2)修改为ARRAY_APPEND(orders_summary.list, input_list2)- WHERE条件中的
NOT list @> input_list修改为NOT orders_summary.list @> input_list - 同逻辑下
amount字段也可加前缀避免潜在歧义
修复后的完整代码
CREATE OR REPLACE FUNCTION update_order(input_id uuid,input_sku text,input_store_id uuid,input_order_date bigint,input_asin text,input_amount int,input_list text[],input_price real,input_list2 text) RETURNS void LANGUAGE plpgsql AS $body$ #variable_conflict use_column BEGIN INSERT INTO orders_summary(id,sku,store_id,order_date,asin,amount,list,price) VALUES(input_id,input_sku,input_store_id,to_timestamp(input_order_date / 1000.0),input_asin,input_amount,input_list,input_price) ON CONFLICT(sku,order_date) DO UPDATE SET list = ARRAY_APPEND(orders_summary.list, input_list2), amount = orders_summary.amount + input_amount, price = input_price WHERE NOT orders_summary.list @> input_list; END $body$;
内容的提问来源于stack exchange,提问作者Mj Ebrahimzadeh
相关产品推荐
相关产品推荐

