overmind 2023-10-06 12:17 采纳率: 92.9%
浏览 3
已结题

无法调用自定义的函数

CREATE TABLE public.bill (
    ic_id character varying(10),
    dk_id character varying(10),
    deal_time timestamp without time zone,
    price numeric
);
CREATE TABLE public.stall (
    dk_id character varying(10),
    shop character varying(20),
    shop_owner character varying(20)
);
 
COPY public.bill (ic_id, dk_id, deal_time, price) FROM stdin;
ic2034123    dk1000234    2023-09-30 11:30:01    15
ic2052342    dk1001584    2023-09-30 11:33:03    30
ic2034123    dk1001584    2023-09-30 11:34:04    3
ic2033233    dk1003324    2023-09-30 11:36:23    20
ic2035678    dk1000436    2023-09-30 11:36:44    20
ic2034434    dk1001584    2023-09-30 11:37:51    25
ic1034139    dk1003324    2023-09-30 11:38:23    20
\.
 
COPY public.stall (dk_id, shop, shop_owner) FROM stdin;
dk1000436    饭是钢    胡小喵
dk1000234    兰州拉面    刘老根
dk1003324    煎饼虎头军    胡小喵
dk1001584    老家肉饼    刘老根
\.
  • 原始表格如上图所示
  • 然后创建了函数
    • 目标是判断店铺是否存在,如果不存在,则插入stall表
\c chinese_food_city
DROP FUNCTION insert_bill_and_stall;

CREATE OR REPLACE FUNCTION insert_bill_and_stall(
    new_ic_id text,
    new_dk_id text,
    new_deal_time time,
    new_price numeric,
    new_shop text,
    new_shop_owner text
)
RETURNS void AS $$
BEGIN
    -- 检查档口是否已存在
    IF EXISTS (SELECT 1 FROM public.stall WHERE dk_id = new_dk_id) THEN
        -- 如果存在,只插入账单表
        INSERT INTO public.bill (ic_id, dk_id, deal_time, price) 
            VALUES (new_ic_id, new_dk_id, new_deal_time, new_price);

    ELSE
        -- 如果不存在,插入档口表和账单表
        INSERT INTO public.stall (dk_id, shop, shop_owner) 
            VALUES (new_dk_id, new_shop, new_shop_owner);
        INSERT INTO public.bill (ic_id, dk_id, deal_time, price) 
            VALUES (new_ic_id, new_dk_id, new_deal_time, new_price);
    END IF;
END;
$$ LANGUAGE plpgsql;
  • 函数调用时
\c chinese_food_city

SELECT insert_bill_and_stall(
    'ic1003532', 
    'dk1001584', 
    TIMESTAMP '2023-10-01 10:00:00', 
    10, 
    '老家肉饼', 
    '刘老根'
);
  • 报错提示

img

  • 不知道该如何修改
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-06 12:26
    关注

    错误提示显示函数调用时传入的参数类型不匹配。
    在函数定义中,参数new_deal_time的类型被定义为time,而在函数调用中,传入的是一个timestamp类型的值。因此,需要修改函数调用时传入参数的类型,保持与函数定义一致。

    以下是修改后的函数调用:

    \c chinese_food_city
    
    SELECT insert_bill_and_stall(
        'ic1003532', 
        'dk1001584', 
        TIME '10:00:00', 
        10, 
        '老家肉饼', 
        '刘老根'
    );
    
    

    这样应该可以成功调用函数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 10月14日
  • 已采纳回答 10月6日
  • 创建了问题 10月6日

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题