Для получения значений STATUS рассмотрите возможность использования VIEW (а не триггера). Вы упомянули таблицу ПРАВИЛ (содержащую minGRADE и т. Д.). Если вы используете Oracle 12c (или новее), вы можете использовать LATERAL JOIN для «вычисления» значений столбца STATUS на лету.
ПРАВИЛА стол
create table rules ( univid, mingrade, minfreq )
as
select 1, 5, 75 from dual ;
Используя определение и данные вашей таблицы SUBJECT, мы можем использовать этот запрос для получения требуемых результатов (уведомление: триггера нет). Мы извлекаем MINGRADE и MINFREQ из таблицы RULES и используем эти значения (через LATERAL JOIN) в CASE основного запроса.
select S.*
, case
when grade >= mingrade and freq >= minfreq then 'ok'
else 'not ok'
end as status
from subject S, lateral (
select mingrade, minfreq from rules where univid = 1
);
-- result
STDID SUBJID SEMEST GRADE FREQ STATUS
---------- ---------- ------ ---------- ---------- ------
1111 2 2/2018 6 75 ok
1111 13 2/2018 7 100 ok
1111 4 1/2018 5 90 ok
1111 7 1/2018 10 95 ok
1111 9 2/2018 8 75 ok
1122 2 2/2017 3 75 not ok
1122 13 2/2017 5 100 ok
1122 4 1/2017 5 90 ok
1122 7 1/2017 10 95 ok
1122 9 2/2017 8 75 ok
1113 2 2/2018 6 75 ok
1113 13 2/2018 7 100 ok
1113 4 1/2018 5 90 ok
1113 7 1/2018 4 95 not ok
1113 9 2/2018 8 75 ok
1132 2 2/2018 3 75 not ok
1132 13 2/2018 7 100 ok
1132 4 1/2018 5 90 ok
1132 7 1/2018 4 95 not ok
1132 9 2/2018 8 75 ok
20 rows selected.
Мы предполагаем, что все студенты зачислены в университет 1 - см. DBfiddle .
Если вы имеете дело с несколькими правилами (для нескольких университетов), вы все равно можете использовать этот подход - без кодирования триггера. В приведенном ниже примере мы {1} создаем таблицу регистрации, которая содержит отображения STUDENT-UNIVERSITY. Для простоты мы просто «зачисляем» студентов с четными студентами в универ 1, студенты с нечетными студентами переходят в универ 2. {2} Мы добавляем правило для уни 2 в таблицу ПРАВИЛ.
-- ENROLMENTS table
create table enrolments( studentid, universityid )
as
select
stdid, mod( stdid, 2 ) + 1
from subject ;
-- add a RULE
insert into rules ( univid, mingrade, minfreq ) values ( 2, 7, 80 ) ;
-- the RULES table now contains ...
SQL> select * from rules ;
UNIVID MINGRADE MINFREQ
---------- ---------- ----------
1 5 75
2 7 80
Этот следующий запрос даст нам значения STATUS в соответствии с ПРАВИЛАМИ, определенными для uni 1 и uni 2 соответственно. (Если есть больше университетов / правил, просто добавьте записи и правила. Никаких триггеров.)
Запрос
select unique
S.*
, case
when grade >= mingrade and freq >= minfreq then 'ok'
else 'not ok'
end as status
, R.univid as "R.uni" -- output: the universityid
, R.mingrade as "R.mingrade" -- and the rules
, R.minfreq as "R.minfreq" -- for both universities - just for "illustration"
from subject S
, lateral(
select universityid from enrolments where S.stdid = studentid
) E
join rules R on E.universityid = R.univid
;
Результат
STDID SUBJID SEMESTER_YEAR GRADE FREQ STATUS R.uni R.mingrade R.minfreq
1122 13 2/2017 5 100 ok 1 5 75
1122 2 2/2017 3 75 not ok 1 5 75
1113 9 2/2018 8 75 not ok 2 7 80
1132 9 2/2018 8 75 ok 1 5 75
1113 4 1/2018 5 90 not ok 2 7 80
1113 13 2/2018 7 100 ok 2 7 80
1132 7 1/2018 4 95 not ok 1 5 75
1132 4 1/2018 5 90 ok 1 5 75
1132 2 2/2018 3 75 not ok 1 5 75
1111 2 2/2018 6 75 not ok 2 7 80
1122 7 1/2017 10 95 ok 1 5 75
1113 7 1/2018 4 95 not ok 2 7 80
1111 4 1/2018 5 90 not ok 2 7 80
1111 7 1/2018 10 95 ok 2 7 80
1111 13 2/2018 7 100 ok 2 7 80
1122 9 2/2017 8 75 ok 1 5 75
1111 9 2/2018 8 75 not ok 2 7 80
1132 13 2/2018 7 100 ok 1 5 75
1113 2 2/2018 6 75 not ok 2 7 80
1122 4 1/2017 5 90 ok 1 5 75
20 rows selected.
DBfiddle здесь .