Postgres Тип параметра не совпадает - PullRequest
0 голосов
/ 30 ноября 2018

У меня странная проблема с 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$;

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Как упоминал Джо, проблема была в array_append, который я не мог найти способ исправить.Вместо этого функции generate_unique_names были изменены, чтобы просто непрерывно запрашивать БД.

CREATE OR REPLACE FUNCTION generate_unique_name (proposed_name text, table_name text, condition text) RETURNS text AS
$BODY$
DECLARE
    unique_name text;
    name_counter integer;
    not_unique boolean;
BEGIN
    unique_name = proposed_name;
    name_counter = 0;

    EXECUTE 'SELECT COUNT(*)!=0 FROM ' || table_name || ' WHERE ' || condition || ' AND name = ''' || unique_name || '''' INTO not_unique;

    WHILE not_unique LOOP
        name_counter = name_counter + 1;
        unique_name = proposed_name || ' (' || name_counter || ')';
        EXECUTE 'SELECT COUNT(*)!=0 FROM ' || table_name || ' WHERE ' || condition || ' AND name = ''' || unique_name || '''' INTO not_unique;
    END LOOP;
    RETURN unique_name;
END;
$BODY$ LANGUAGE plpgsql;
0 голосов
/ 30 ноября 2018

Я предполагаю, что в столбце name таблицы queue есть значение, которое вызывает проблему с

names_to_check = array_append(names_to_check, r.name::text) 
...