写了一个 postgres 的function (存储过程) , 在insert into 一个临时表的时候一直报错 type “v_company_sales” does not exist 42704,

涉事代码片段如下:

raise notice ‘%’, ‘before inserting pb’ ;
raise notice ‘%’, v_company_sales ;
insert into hd40.temp_ycbm_company_pb_proportion_summary(
brand ,
sales_amount ,
proportion ,
margin ,
margin_proportion ,
margin_proportion_percent ,
sku_count ,
sku_proportion,
sales_sku ,
margin_sku ,
queryid,
bgdate ,
eddate ,
gcode ,
category ,
gename ,
creation_date ,
created_by ,
attribute1 ,
attribute2,
attribute3
)values(
‘PB’, ———– v_pb_sales ,v_pb_margin,v_pb_sku v_company_sales,v_company_margin ,v_company_sku
v_pb_sales,
round(v_pb_sales100::v_company_sales, 1)||’%’, v_pb_margin , round(v_pb_margin100::v_company_margin, 1)||’%’,——pb_proportion ,
round(v_pb_margin100::v_pb_sales, 1)||’%’, —-round(complete100::numeric/total, 1)||’%’
v_pb_sku,
‘100%’,
v_pb_sales/v_pb_sku ,
v_pb_margin/v_pb_sku ,
v_queryid,
inbgdate ,
ineddate,
ingcode ,
incategory ,
inename,
current_timestamp,
‘created_by ‘ ,
‘attribute1 ‘,
‘attribute2’,
‘attribute3’
);

明明是v_company_sales 在执行之前可以看到结果,为什么一insert into 就报 type “v_company_sales” does not exist 42704

开始我怀疑v_company_sales 变量作用域问题, 仔细考虑了一下即使不在同一个begin ….end 块里面,应该也有效,通过

raise notice ‘%’, ‘after inserting pb’ ;
raise notice ‘%’, v_company_sales ;

在执行过程中把数据打出来,可见变量作用域没用问题,当然变量名字更没有问题。

尝试1:后来干脆把该变量改过money-numberic 数据类型,一样没解决问题,但是,从后来看接近了。

尝试2: 再后来,想办法把v_company_sales全部写死换成数字, 报错

function round(money, integer) does not exist 42883

这里就很明显了,形参不对

round (cast(doublecolumn as numeric),2) should work ok

最后说, 这个报错有点匪夷所思,本来系统标准函数round 用的不对直接提示就好了,结果提示的东西让人怀疑变量,作用域, 数据类型 最终才解决。

Leave a Reply

Your email address will not be published.