#plsql #insert #oracle-sqldeveloper #percentage
#plsql #вставить #oracle-sqldeveloper #процент
Вопрос:
Приведенная ниже таблица должна быть результатом, которого я хочу достичь. Это означает, что в зависимости от того, какое значение находится в column1, которое является процентом, и какое значение находится в column2. column1 будет выполнять процент от column2. Например, 80% от 1000 = 800, которое будет изменено в столбце 2 2-й записи.
В настоящее время мой код может выбрать только текущую запись и вставить другую копию, которая будет дублировать ту же запись. Но теперь мне нужно вычислить и перезаписать значения столбца 2 в зависимости от размера. Я не помещал здесь свой код выбора, поскольку боялся, что вы все запутаетесь. Я только поместил здесь свой код вставки, пожалуйста, скажите мне, как выполнить формулу в коде для процента для столбца2 спасибо.
Orginal 1st record-> column1 column2
80 1000
Inserted copy records which is 2nd record column1 column2
(what I want to achieved) 80 800
Мои коды
ВСТАВИТЬ В table1 (column1, column2) ЗНАЧЕНИЯ (tran.column1, tran.column2);
Ответ №1:
Если вы не возражаете против добавления третьего столбца, это можно сделать быстро без триггеров в Oracle 11 или более поздней версии с помощью виртуального столбца на основе функций.
create table table1 (col1 integer, col2 integer, col3 as (col1 / 100 * col2));
SQL> insert into table1(col1,col2) values(80, 1000);
1 row created.
SQL> select * from table1;
COL1 COL2 COL3
---------- ---------- ----------
80 1000 800
SQL>
Преимущество в том, что вы сохраняете исходное значение, поэтому, если COL1 (процент) обновляется или вы меняете формулу, результаты пересчитываются.
В противном случае создайте триггер BEFORE INSERT ДЛЯ КАЖДОЙ СТРОКИ.
CREATE OR REPLACE TRIGGER ins_table1
BEFORE INSERT ON table1 cFOR EACH ROW
BEGIN
:NEW.col2 := :NEW.col1 / 100 * :NEW.col2;
END;
/
Комментарии:
1. Это было бы моим предпочтительным решением, если бы данных еще не было в таблице. Определенно путь вперед, но в вопросе не оговаривалось, что версия DB была 11gR1 или выше.
Ответ №2:
Если ваши данные уже существуют в таблице, вы можете просто обновить эту строку:
UPDATE table1
SET column2 = column1 / 100 * column2
WHERE table1.id = ...
Я бы все же рекомендовал решение @mrjoltcola, если вы используете последнюю версию DB и можете изменить таблицу. Это гораздо более элегантно и позволяет вам видеть значения, на которых основаны ваши вычисления. Этот оператор UPDATE, если он выполняется более одного раза, приведет к потере значений column2 .
Комментарии:
1. Я отредактировал свой пост, чтобы сделать его более понятным. И нет, 2-я запись не существует в таблице, если я не использую свой код вставки. Так что это означает, что это не обновление. Я хочу вставить 2-ю запись, дублированную из 1-й записи, но будет изменено только значение column2 2-й записи. @Pete Mahon