Здравствуйте!
Подскажи пожалуйста.
Предположим есть таблица
Tabl
--------------------------------------
Поле1 | Поле2 | Поле3 |
--------------------------------------
integer | tinterval | tinterval |
Я хочу написать тригерную функцию которая бы автоматически умножала Поле1*Поле2, а результат записывала в Поле3. Чтобы оператор при внесении данных в Поле1 и Поле2 не занимался умножением для Поле3 и не мог ошибиться.
Я смог реализовать это на PL/Perl, взяв небольшой пример из интернета и пару библиотек из CPAN. Но сейчас база работает под Postgresql-8.4.3 собранная компанией "1C", причём без поддержки PL/PERL. Из языков только PL/C, PL/SQL, PL/internal. Решил попробовать найти пример на PL/SQL и ни один не смог заставить работать. Т.е. я даже не смог создать функцию.
Подскажите пожалуйста, мне нужен рабочий пример, хоть будет от чего отталкиваться. Все книги по PL/SQL в основном под Oracle и предлагаемые примеры копи-пастом у меня не пошли.
Самое смешное, что для этой
Самое смешное, что для этой задачи вам не нужен триггер, вы можете либо напрямую запрашивать сумму из таблицы:
SELECT поле1, поле2, поле1*поле2 AS поле3 FROM таблица;
или сделать VIEW с псевдоколонкой поле 3
CREATE VIEW новая_таблица AS SELECT поле1, поле2, поле1*поле2 AS поле3 FROM таблица;
VIEW не хранится на диске, так что объём базы от этого не увеличится.
Спасибо! Действительно смешно
Спасибо!
Действительно смешно и просто.
Я правильно понимаю, что если результат этого селекта где-то использовать дальше, то последующие запросы будут отрабатывать медленнее, чем если бы брали готовый результат из моей же таблицы? Если так, то в каких случаях имеет смысл держать такой промежуточный результат уже вычисленным? Зависит от кол-во строк или вложенности запросов?
Да, чуточку медленней будет,
Да, чуточку медленней будет, но не сильно. Операция умножения довольно проста, а основные проблемы с производительностью возникают при обработке условий выборки, группировки, дистинкта и т.д. Учитывая это, затраты на умножение уже двух готовых, выбранных полей ничтожны.