在 postgres returns 语法错误中使用执行
using execute in postgres returns syntax error
我正在尝试调试此程序并找出出现语法错误的原因:
CREATE OR REPLACE FUNCTION public.myfunc(_report_id integer, _cutoff_date date)
RETURNS record
LANGUAGE plpgsql
AS $function$
declare
_deliverable_id RECORD ;
BEGIN
FOR _deliverable_id IN
SELECT deliverable_id FROM public.deliverables where report_id=_report_id
LOOP
execute format('DROP TABLE IF EXISTS report.products_%I',_deliverable_id);
END LOOP;
END
$function$
;
当我执行这个时,我得到:
syntax error at or near ""(1111)""
1111 肯定是一个可交付成果,所以这让我认为它与执行语句格式或我使用 %I 的方式有关?
%I
被替换为一个整体标识符。如果你想连接东西,你需要在 before 替换。
您可以通过检查 format()
函数的结果为自己 test/debug 这样做:
select format('DROP TABLE IF EXISTS report.products_%I',42);
returns DROP TABLE IF EXISTS report.products_"42"
您需要使用:
select format('DROP TABLE IF EXISTS report.%I',concat('products_', 42));
哪个正确 returns DROP TABLE IF EXISTS report.products_42
(显然你需要用你的变量替换 42
。
我正在尝试调试此程序并找出出现语法错误的原因:
CREATE OR REPLACE FUNCTION public.myfunc(_report_id integer, _cutoff_date date)
RETURNS record
LANGUAGE plpgsql
AS $function$
declare
_deliverable_id RECORD ;
BEGIN
FOR _deliverable_id IN
SELECT deliverable_id FROM public.deliverables where report_id=_report_id
LOOP
execute format('DROP TABLE IF EXISTS report.products_%I',_deliverable_id);
END LOOP;
END
$function$
;
当我执行这个时,我得到:
syntax error at or near ""(1111)""
1111 肯定是一个可交付成果,所以这让我认为它与执行语句格式或我使用 %I 的方式有关?
%I
被替换为一个整体标识符。如果你想连接东西,你需要在 before 替换。
您可以通过检查 format()
函数的结果为自己 test/debug 这样做:
select format('DROP TABLE IF EXISTS report.products_%I',42);
returns DROP TABLE IF EXISTS report.products_"42"
您需要使用:
select format('DROP TABLE IF EXISTS report.%I',concat('products_', 42));
哪个正确 returns DROP TABLE IF EXISTS report.products_42
(显然你需要用你的变量替换 42
。