You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含COPY语句的PostgreSQL存储过程调用后持续运行问题求助

存储过程执行卡死问题排查

我正在编写一个用于刷新数据库两张表的存储过程:detail_report表带有触发器,会将插入的行同步到summary_report表。这是课程作业,要求复用之前将数据导入第一张表的语句。相关查询单独执行均正常,但调用存储过程时会一直运行,肯定存在疏漏。

最初的COPY版本代码

CREATE OR REPLACE PROCEDURE refresh_tables()
LANGUAGE plpgsql
AS $$
BEGIN
DELETE FROM detail_report;
DELETE FROM summary_report;

COPY
(SELECT title, rating, convert_to_money(amount) AS rental_amount, name AS genre
FROM film f
INNER JOIN inventory i
ON f.film_id = i.film_id
INNER JOIN rental r
ON i.inventory_id = r.inventory_id
INNER JOIN payment p
ON p.rental_id = r.rental_id
INNER JOIN film_category f_c
ON f_c.film_id = f.film_id
INNER JOIN category c
ON c.category_id = f_c.category_id
ORDER BY title) TO 'D:\CodingAndSoftware.detail_report.csv' WITH CSV HEADER;

COPY detail_report
FROM 'D:\CodingAndSoftware.detail_report.csv'
DELIMITER ','
CSV HEADER;

RETURN;
END;
$$;

convert_to_money是他人协助添加的函数,但我认为这不是问题根源——我尝试移除该函数仅保留列名,问题依旧存在,因此怀疑和COPY命令有关。

改用INSERT的版本代码

之后我移除了COPY命令,改用课程资料中讲师推荐的INSERT INTO ... SELECT方式,但调用存储过程时仍会一直运行。问题应该很简单,但我暂时无法发现。

CREATE OR REPLACE PROCEDURE refresh_tables()
LANGUAGE plpgsql
AS $$
BEGIN
DELETE FROM detail_report;
DELETE FROM summary_report;

INSERT INTO detail_report
SELECT title, rating, convert_to_money(amount) AS rental_amount, name AS genre
FROM film f
INNER JOIN inventory i
ON f.film_id = i.film_id
INNER JOIN rental r
ON i.inventory_id = r.inventory_id
INNER JOIN payment p
ON p.rental_id = r.rental_id
INNER JOIN film_category f_c
ON f_c.film_id = f.film_id
INNER JOIN category c
ON c.category_id = f_c.category_id
ORDER BY title;

RETURN;
END;
$$;

内容的提问来源于stack exchange,提问作者Alexandra Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 07:18:33