overmind 2023-10-01 22:09 采纳率: 92.9%
浏览 9
已结题

定义了函数,但是无法根据函数定义触发器


DROP DATABASE 
    chinese_food_city;

CREATE DATABASE
    chinese_food_city;
    
\c chinese_food_city

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    老家肉饼    刘老根
\.
  • 首先构建基础数据
  • 然后创建函数和触发器
\c chinese_food_city
CREATE OR REPLACE FUNCTION add(
    IN p_a integer,
    IN p_b integer,
    OUT p_sum integer
)
    AS 
    $BODY$ 
        BEGIN
            p_sum:= p_a + p_b;  -- 进行加法运算,并将计算结果赋值给输出的参数p_sum
        END;
    $BODY$ 
    LANGUAGE 'plpgsql'            -- 指定函数的程序语言
    VOLATILE                    -- 优化器不进行优化
    RETURNS NULL ON NULL INPUT; -- 当传入参数含有null时返回null

CREATE TRIGGER after_insert_bill 
    AFTER INSERT ON bill
    FOR EACH ROW
    EXECUTE FUNCTION add(1,2);

INSERT INTO
    bill(ic_id,dk_id,deal_time,price)
VALUES
    ('ic1034139', 
     'dk1003324',
     '2023-09-30 11:38:24',
     '20')
;
  • 我明明定义了函数add,却无法定义触发器,报错如下。

img

  • 为什么找不到函数 add?
  • 写回答

6条回答 默认 最新

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

    引自强大而免费的微信小程序:皆我百晓生。如有帮助,还望采纳。


    根据你提供的代码片段,触发器无法找到函数 add 的原因可能是因为函数定义和触发器的创建是在不同的事务中进行的。当你尝试创建触发器时,函数可能还没有完全创建并且可见。

    为了解决这个问题,可以尝试将函数和触发器的创建代码放在同一个事务中,或者确认函数已经成功创建后再创建触发器。

    以下是修正后的完整代码示例:

    \c chinese_food_city
    
    -- 创建函数
    CREATE OR REPLACE FUNCTION add(
        IN p_a integer,
        IN p_b integer,
        OUT p_sum integer
    ) AS $$
    BEGIN
        p_sum := p_a + p_b;
    END;
    $$ LANGUAGE plpgsql VOLATILE RETURNS NULL ON NULL INPUT;
    
    -- 确认函数成功创建
    SELECT add(1, 2);
    
    -- 创建触发器
    CREATE TRIGGER after_insert_bill
    AFTER INSERT ON bill
    FOR EACH ROW
    EXECUTE FUNCTION add(1, 2);
    
    -- 插入数据
    INSERT INTO bill(ic_id, dk_id, deal_time, price)
    VALUES('ic1034139', 'dk1003324', '2023-09-30 11:38:24', '20');
    

    请注意,代码示例中的函数创建和触发器创建的顺序可能对于一些数据库管理系统是敏感的,因此可能需要根据具体情况进行调整。此外,请确保已经连接到正确的数据库,并且用户拥有足够的权限来创建函数和触发器。

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

报告相同问题?

问题事件

  • 系统已结题 10月10日
  • 已采纳回答 10月2日
  • 修改了问题 10月2日
  • 创建了问题 10月1日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装