我在postgres中使用以下函数返回预期值时遇到问题,我不确定我做错了什么。
功能:
create or replace function check_row_diff(_table_minuend varchar(255), _table_subtrahend varchar(255))
returns bigint as $$
declare
v_num numeric;
BEGIN
execute format ('SELECT
(select count(*) from %s)
- (select count(*) from %s) AS Difference', _table_minuend, _table_subtrahend);
return v_num;
end;
$$ language plpgsql;
然后运行一个select,返回" NULL"
select check_row_diff('table_1', 'table_2');
使用"执行"语句只返回错误。在SQL查询中运行此命令会返回正确的结果。 Table_1(名称混淆)有4,568条记录,table_2(名称混淆)有2,284条记录:
select
(select count(*) from table_1)
- (select count(*) from table_2) as difference
返回2,284的计数。我需要这个检查才能工作,因为我在python中编写了一个中间件应用程序,允许我们的系统集成到云SaaS。我正在使用"工作"桌子和"金色"用于确保每天数据馈送成功并且记录不会丢失的表格,因为它将集成到许多内部系统中。我无法在postgres版本中使用UPSERT / MERGE,因为数据库平台是在无服务器设计(第三方托管底层实例)中托管的SaaS云。在更新" golden"之前,此函数将作为数据验证模块的一部分调用。表,然后将数据馈送到下游系统。
如果您需要有关此问题的更多信息,请与我们联系。
答案 0 :(得分:1)
应使用execute()
into:
的结果分配给变量
create or replace function check_row_diff(_table_minuend text, _table_subtrahend text)
returns bigint as $$
declare
v_num numeric;
begin
execute format ('select
(select count(*) from %s)
- (select count(*) from %s)', _table_minuend, _table_subtrahend)
into v_num;
return v_num;
end;
$$ language plpgsql;