Для таких целей вам понадобится динамический sql. Обновление может быть запущено в EXECUTE IMMEDIATE
. Рекомендуется использовать <column>%type
для параметров, относящихся к именам столбцов.
CREATE OR replace PROCEDURE update_book(p_id_book book.id_book%TYPE,
p_column VARCHAR2,
p_value VARCHAR2)
AS
BEGIN
EXECUTE IMMEDIATE 'UPDATE book SET '||p_column||' = :p_value
WHERE id_book = :p_id_book'
USING p_value, p_id_book;
END;
Здесь важно отметить, что, поскольку p_value
определен как VARCHAR2
, он будет работать нормально, если вы передадите строки или числа. Для типов date
и timestamp
вы должны соблюдать особую осторожность в отношении передачи правильных форматов. особенно если вы передаете строки (вместо даты), чтобы избежать ошибок из-за неявного преобразования.