USEGEAR

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

pg 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换

这个问题真TMD狗血。

做了一个函数,调试完成后运行都ok。

复制代码
CREATE OR REPLACE FUNCTION "public"."fn_UpsertDeptAppParms"("pyear" int2, "pmonth" int2)
  RETURNS "pg_catalog"."bool" AS $BODY$
DECLARE 
    PYearMonth  VARCHAR;
    PFieldName  VARCHAR;
    aSQL VARCHAR;
    ARecord  RECORD;    
BEGIN
    -- Routine body goes here...
  PYearMonth := to_char(Pyear, 'fm9999') ||'-'|| to_char(Pmonth, 'fm00');
    
    aSQL := 'select * from "public"."DeptApportionParamsCollect_View" where "DAPC_YearMonth" ='||quote_nullable(trim(PYearMonth));
  FOR ARecord in (select * from "public"."DeptApportionParamsCollect_View" where "DAPC_YearMonth" = (PYearMonth)) loop  -- = quote_nullable(trim(PYearMonth))) loop
        PFieldName := ARecord."DAPC_FieldName"; 
    aSQL :=
        'INSERT INTO "public"."DeptApportionParams"(
            "DAP_Year",--年
            "DAP_Month",--月
            "HD_Type",--科室大类
            "HD_No",--科室ID
            "HD_Code",--科室代码
            "HD_Name",--科室名称
            "'|| PFieldName||'",
             "DAP_Updatetime"
            )
      values
      (
            '||Pyear||',
            '||Pmonth||', 
            '||quote_nullable(ARecord."HD_Type")||',
            '||quote_nullable(ARecord."HD_No")||',
            '||quote_nullable(ARecord."HD_Code")||',
            '||quote_nullable(ARecord."HD_Name")||',
            '||quote_nullable(ARecord."DAPC_Value")||',
            now()
            )
     ON conflict ON CONSTRAINT "pr_DAP_Key"  DO UPDATE SET 
    
        "'||PFieldName||'" = '||quote_nullable(ARecord."DAPC_Value")||',
        "DAP_Updatetime" = NOW()
    ';
    EXECUTE aSQL;
  END loop;

    RETURN TRUE;
EXCEPTION 
    WHEN OTHERS THEN
        RETURN FALSE;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
复制代码

 

 

可是调用时出现错误:

SELECT "public"."fn_UpsertDeptAppParms"(2022, 2)

错误:  函数 public.fn_UpsertDeptAppParms(integer, integer) 不存在
LINE 1: EXPLAIN SELECT "public"."fn_UpsertDeptAppParms"(2022, 2)
                       ^
HINT:  没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.

网上找了一大堆,也没看懂弄明白,照抄一通还是不行。

折腾几天了。突然想起在upsert中,字符串也可以insert到integer类型字段。于是把参数修改成:

复制代码
SELECT "public"."fn_UpsertDeptAppParms"('2022', '2')

居然成功了:
EXPLAIN SELECT "public"."fn_UpsertDeptAppParms"('2022', '2')
> OK
> 查询时间: 0s


pg具有自动转型的功能。难以想到。但为什么数字就不行呢?你知道请告诉我。

https://www.cnblogs.com/usegear/p/16363994.html
复制代码

posted on   USEGEAR  阅读(5141)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示