我从存储过程中运行的查询中得到的计数不正确。 当我们运行相同的查询(在对表名和模式名的值进行硬编码之后),它将给出正确的结果。
初步分析表明,由于某种原因,在存储过程内部运行的查询会忽略第二个过滤器(即...和...,第二部分将被忽略)。
CREATE OR REPLACE PROCEDURE dev.gp_count (tablename VARCHAR(256))
AS
$$ DECLARE schema_name VARCHAR(64);
table_name VARCHAR(128);
check_count_1 INT;
check_count_2 INT;
BEGIN
schema_name:= SPLIT_PART(tablename,'.',1);
table_name:= SPLIT_PART(tablename,'.',2);
check_count_1 := (select count(*) from information_schema.tables where table_schema = schema_name and table_name like '%' + table_name +'%');
raise info 'check_count_1 - %',check_count_1;
end;
$$
language plpgsql;
并将上述过程称为-
call dev.gp_count ('dev.gp_test1');
从存储过程获得的结果是- 警告: check_count_1-925
如果在替换表名和模式的值后运行相同的查询,则-
select count(*) from information_schema.tables where table_schema = 'dev' and table_name like '%gp_test1%';
结果-
count
3
现在进一步调查问题-
从存储过程获得的计数与从此查询获得的计数相同-
select count(*) from information_schema.tables where table_schema = 'dev';
结果-
count
925
我的猜测-
因此,这暗示着,也许在存储过程中第二个过滤条件被忽略了。
除了帮助我其他选择之外,请也帮助我找到造成这种异常现象的原因。
谢谢。
答案 0 :(得分:2)
我认为您的问题出在1)您的字符串连接和2)使用table_name
作为变量:
check_count_1 := (select count(*) from information_schema.tables where table_schema = schema_name and table_name like '%' + table_name +'%');
PostgreSQL字符串连接使用||
,因此它应如下所示:
check_count_1 := (select count(*) from information_schema.tables where table_schema = schema_name and table_name like '%' || table_name || '%');
尝试将其更改为这样:
CREATE OR REPLACE PROCEDURE gp_count (tablename VARCHAR(256))
AS
$$ DECLARE
schema_name VARCHAR(64);
table_name1 VARCHAR(128);
check_count_1 INT;
check_count_2 INT;
BEGIN
schema_name:= SPLIT_PART(tablename,'.',1);
table_name1:= SPLIT_PART(tablename,'.',2);
check_count_1 := (select count(*) from information_schema.tables f where table_schema = schema_name and f.table_name like '%' || table_name1 || '%');
raise info 'check_count_1 - %',check_count_1;
end;
$$
language plpgsql;
披露:我为EnterpriseDB (EDB)工作