在 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