Postgres: усечение, если существует в функции psql с параметром


9

Я пытаюсь получить функцию psql, которая усекает заданное имя таблицы, если оно существует. Я пробовал несколько функций, но ни одна из них не работала до сих пор. Вот код:

CREATE OR REPLACE FUNCTION truncateIfExists(tableName TEXT)
returns void
as $$
BEGIN
EXECUTE format(
'IF EXISTS (
    SELECT *
    FROM information_schema.tables 
    WHERE table_name =' || tableName || '
    )
THEN
TRUNCATE tableName;
END IF;
');
END;
$$language plpgsql

Теперь я могу заставить его работать в простой процедуре с зашифрованным именем:

do $$
begin
IF EXISTS (SELECT * 
 FROM information_schema.tables 
 WHERE table_name = genre_epf)
 THEN
 TRUNCATE genre_epf;
END IF;
end
$$;

Но я не могу понять, как смешать оба запроса. Что я здесь не так делаю?


Проблема в том TRUNCATE tableName;. Вы пытаетесь tableName
обрезать

Ответы:


7

Используйте переменную FOUND :

create or replace function truncate_if_exists(tablename text)
returns void language plpgsql as $$
begin
    perform 1
    from information_schema.tables 
    where table_name = tablename;
    if found then
        execute format('truncate %I', tablename);
    end if;
end $$;

Обратите внимание, что я использовал PERFORMвместо того, чтобы SELECTмне не нужен вывод запроса. Я хочу знать, возвращает ли запрос какую-либо строку ( FOUND = true) или нет ( FOUND = false).


Спасибо за помощь. Подчеркивание имен Postgres?
Stanislasdrg Восстановить Монику

1
Можно использовать «camelCaseIdentifiers», но они должны быть заключены в двойные кавычки, чтобы быть действительно чувствительными к регистру. Следовательно, identifiers_with_underscores - это соглашение, которое предпочитают многие продвинутые пользователи Postgres. Читайте об идентификаторах в документации.
Клин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.