Использование переменной в качестве столбца% TYPE (ORACLE) - PullRequest
0 голосов
/ 13 мая 2018

Мне нужно сделать процедуру редактирования таблицы «Пример» edit_exemplare(p_id_exemplare IN NUMBER, p_column VARCHAR2, p_value ???), который обновляет значение в столбце строки с этим ID .

Проблема в том, что столбцы этой таблицы имеют разные типы данных. Могу ли я сделать что-то вроде p_value exemplare.p_column%TYPE? Или я должен установить его в VARCHAR2, а затем (каким-то образом) использовать преобразование в правильный тип данных?

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Могу ли я сделать что-то вроде 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-разработчики утверждают, что базы данных работают медленно, когда на самом деле проблема в вызывающем конце.

Существуют различные способы решения этой проблемы, и правильный путь будет зависеть от точных деталей того, что вы пытаетесь сделать. Ключевой момент: одна транзакция должна выполнить * не более одного ** оператора обновления для каждой записи. Правильно заданная операция, которая обновляет несколько записей в одном операторе, еще лучше.

0 голосов
/ 13 мая 2018

вы можете использовать {table}%ROWTYPE в качестве ввода. это хороший пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...