У меня странная проблема с Postgres (10.5).У меня есть функция generate_unique_name
, которая принимает три текстовых значения.Работает отлично;однако, вызов этой функции кажется проблемой.Когда я вызываю функцию, используя:
SELECT generate_unique_name('basic', 'seeds', 'project=' || 2)
Она работает без проблем.Я могу сделать один и тот же звонок несколько раз.Теперь, когда я пытаюсь сделать тот же вызов, но изменим второй параметр, как показано ниже:
SELECT generate_unique_name('basic', 'queue', 'project=' || 2)
Тогда, похоже, произойдет сбой с ошибкой:
ОШИБКА: тип параметра 9(текст) не совпадает с тем, что при подготовке плана (изменение символа) КОНТЕКСТ: функция PL / pgSQL имя_генерического_значения (текст, текст, текст) строка 12 в состоянии SQL назначения: 42804
Я попытался изменитьзапрос к:
SELECT generate_unique_name('basic'::text, 'queue'::text, ('project=' || 2)::text)
Но это также не удается.Если я затем прерву соединение с базой данных postgres, создам новую и вместо этого начну со второго запроса, он теперь работает, но первый перестает работать.
Похоже, что postgres решает прекратить обрабатывать параметры как часть текста, без видимой причины.Я что-то пропустил?
РЕДАКТИРОВАТЬ: код для имени_генерического_узла
CREATE OR REPLACE FUNCTION public.generate_unique_name(
proposed_name text,
table_name text,
condition text)
RETURNS text
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
DECLARE
unique_name text;
name_counter integer;
r record;
names_to_check text[];
BEGIN
unique_name = proposed_name;
name_counter = 0;
FOR r IN EXECUTE 'SELECT name FROM ' || table_name || ' WHERE ' || condition LOOP
names_to_check = array_append(names_to_check, r.name::text);
END LOOP;
WHILE unique_name = ANY(names_to_check) LOOP
name_counter = name_counter + 1;
unique_name = proposed_name || ' (' || name_counter || ')';
END LOOP;
RETURN unique_name;
END;
$BODY$;