Могу ли я сделать что-то вроде p_value instancelare.p_column% TYPE?
Нет. Подпись процедуры должна быть статической. Что вы можете сделать, это перегрузить процедуру в пакете:
procedure edit_exemplare(p_id_exemplare IN NUMBER, p_column VARCHAR2, p_value VARCHAR2);
procedure edit_exemplare(p_id_exemplare IN NUMBER, p_column VARCHAR2, p_value DATE);
procedure edit_exemplare(p_id_exemplare IN NUMBER, p_column VARCHAR2, p_value NUMBER);
Однако вам все еще нужен динамический SQL для интерпретации метаданных p_column
, поэтому ваш код останется неуклюжим.
Этот подход напоминает мне парадигму получения и установки, которая все еще преобладает в объектно-ориентированном программировании. Это не тот подход, который подходит для SQL. Чтобы отредактировать три столбца таблицы, вы сделаете три процедурных вызова, которые сгенерируют и выполнят три динамических оператора UPDATE. Это не очень хорошо масштабируется, и именно из-за этого OO-разработчики утверждают, что базы данных работают медленно, когда на самом деле проблема в вызывающем конце.
Существуют различные способы решения этой проблемы, и правильный путь будет зависеть от точных деталей того, что вы пытаетесь сделать. Ключевой момент: одна транзакция должна выполнить * не более одного ** оператора обновления для каждой записи. Правильно заданная операция, которая обновляет несколько записей в одном операторе, еще лучше.