如何在postgres中创建函数,返回以参数

时间:2018-03-25 16:09:49

标签: postgresql function plpgsql dynamic-sql

我在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"之前,此函数将作为数据验证模块的一部分调用。表,然后将数据馈送到下游系统。

如果您需要有关此问题的更多信息,请与我们联系。

1 个答案:

答案 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;