Подсчет дает неправильные результаты в хранимой процедуре - PullRequest
1 голос
/ 31 октября 2019

Я получаю неправильный счет из запроса, выполненного внутри хранимой процедуры. Когда мы выполняем тот же запрос (после жесткого кодирования значений имени таблицы и имени схемы), он дает правильный результат.

Предварительный анализ указывает на то, что запрос по какой-либо причине выполняется внутри хранимой процедуры. игнорирование второго фильтра (т. е. где ... и ..., вторая часть игнорируется).

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%';

RESULT -

count
3

Теперь продолжаем исследовать проблему -

Число, полученное с помощью хранимой процедуры, совпадает с числом, полученным с помощью этого запроса -

select count(*) from information_schema.tables where table_schema = 'dev';

РЕЗУЛЬТАТ -

count
925

Моя догадка -

Таким образом, это указывает на то, что, возможно, внутри хранимой процедуры второе условие фильтра игнорируется.

Помимо помощи мне соИз других альтернатив, пожалуйста, помогите мне найти причину этой аномалии.

Заранее спасибо.

1 Ответ

2 голосов
/ 31 октября 2019

Я думаю, что ваша проблема заключается в 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)

...