【发布时间】:2022-01-14 15:56:12
【问题描述】:
我正在尝试将 Postgres 存储过程改编为函数,以便向调用者提供一些反馈。
该过程有条件地删除特定架构中的行,我希望该函数执行相同的操作,但还返回为每个架构删除的行数。
原来的存储过程是:
create or replace procedure clear_tenants()
language plpgsql as $function$
declare
tenant text;
begin
for tenant in
select tenant_schema
from public.tenant_schema_mappings
loop
execute format($ex$
delete from %I.parent
where expiration_date_time < now()
$ex$, tenant);
end loop;
end
$function$;
我目前转换成函数的是:
CREATE OR REPLACE FUNCTION testfun()
RETURNS TABLE(tsname varchar, amount numeric) AS
$BODY$
declare
tenant text;
trow record;
BEGIN
for tenant in
select tenant_schema
from public.tenant_schema_mappings
loop
execute format($ex$
WITH deleted AS (
delete from %I.parent
where expiration_date_time < now()
IS TRUE RETURNING *
)
tsname := tenant;
amount := (SELECT * FROM deleted;);
return next;
$ex$, tenant);
end loop;
END
$BODY$ language plpgsql;
这可能在各种方面都是错误的。我肯定很困惑。
使用SELECT * FROM testfun() 执行此操作时,出现以下错误:
ERROR: syntax error at or near "tsname"
LINE 7: tsname := tenant;
^
QUERY:
WITH deleted AS (
delete from anhbawys.parent
where expiration_date_time < now()
IS TRUE RETURNING *
)
tsname := tenant;
amount := (SELECT * FROM deleted;);
return next;
CONTEXT: PL/pgSQL function testfun() line 9 at EXECUTE
SQL state: 42601
很明显我没有正确分配行的列,但我不确定如何。
我发现this question 看起来很相似,但我的理解有点复杂。
【问题讨论】:
标签: sql postgresql plpgsql