最近被派了个活,要整一个postgres存储过程的脚本,然而本人并不会玩postgres,而且也没接触过存储过程,这几天不知道走了踩了多少坑。
由于数据量比较大,故需要分区处理。在成功对原表进行散列分区并存入测试数据之后,领导说验证一下分区表数据条数与输入的测试数据条数是否一致,于是要查询分区表的数据条数。
由于分区表的个数较多,不想一个个手动输入再查找,于是采用存储过程动态拼接分区表名并进行查询。
第一个坑:静态执行select无法使用拼接的表名
create or replace function get_line_number(table_name_t varchar) returns integer as $$
declare
line_number integer;
begin
-- 【注意】以下为错误代码
---------------------------------------错误代码分隔符---------------------------------------
-- 假设你传入的传入的表名是'ABCD',那么下面这句话并不是操作表'ABCD',而是操作表名为'table_name_t'的表!!
-- 所以执行select count(*)的时候想用动态表名就只能够使用动态写法
select count(*) into line_number from table_name_t;
---------------------------------------错误代码分隔符---------------------------------------
return line_number;
end;
$$ language plpgsql;
第二个坑:动态执行不能传入局部变量
create or replace function get_line_number(table_name_t varchar) returns integer as $$
declare
line_number integer;
begin
-- 【注意】以下为错误代码
---------------------------------------错误代码分隔符---------------------------------------
-- 这种写法并不能将查询结果存入line_number,基本是执行错误的节奏
execute 'select into line_number count(*) from ' || table_name_t;
---------------------------------------错误代码分隔符---------------------------------------
return line_number;
end;
$$ language plpgsql;
正确写法
create or replace function get_line_number(table_name_t varchar) returns integer
as
$$
declare
line_number integer;
begin
-- 只用把上一步的into移到外面来就行了,(鬼知道这一步我卡了多久,中间还用了临时表插入再查询什么的就不说了...)
execute 'select count(*) from ' || table_name_t into line_number;
return line_number;
end;
$$ language plpgsql;