Как удалить строку в хранимой процедуре в PostgreSQL с динамическими именами таблиц и столбцов?delete_word
будет тот, который следует удалить.
CREATE OR REPLACE PROCEDURE delete_row(tablename VARCHAR(255),columnname VARCHAR(255), delete_word VARCHAR(255))
language plpgsql
as $$
BEGIN
EXECUTE 'DELETE FROM ' || quote_ident(tablename) || ' WHERE ' || columnname || ' = ' || quote_ident(delete_word);
END $$;
CALL delete_row('sales_2019','orderid', 'Order ID');
Правильная обработка динамического SQL:
CREATE OR REPLACE PROCEDURE delete_row(tablename text, columnname text, delete_word text)
LANGUAGE plpgsql AS
$proc$
DECLARE
_sql text := format('DELETE FROM %I WHERE %I = $1', $1, $2);
BEGIN
-- RAISE NOTICE '%', _sql; -- debug first?!
EXECUTE _sql
USING delete_word;
END
$proc$;
Вызов:
CALL delete_row('sales_2019', 'orderid', 'Order ID');
Видеть:
Динамический SQL с format() и EXECUTE нужен только в том случае, если имя таблицы и столбца действительно должно быть переменным. Ответ является доказательством концепции для более сложных задач. Простая команда, как в примере, я бы предпочел просто объединить и выполнить как обычный SQL.
Также используется тип данных text
для аргументов. varchar(255)
не делает там ничего полезного и, как правило, является недоразумением, перенесенным из других СУБД. Видеть:
Отмечен за это, сэр! Я проведу дополнительные исследования, чтобы лучше понять Dynamic SQL.