If you don't want to use a stored procedure then the only other option is a trigger.
create or replace trigger book_discount_rule
before insert, update on BOOK
for each row
begin
if :new.price > 200
then
:new.discount := 20;
else
:new.discount := 0;
end if;
end;
Personally I dislike this solution, precisely because triggers are invisible. That is, if the user runs this insert statement ...
insert into book
values (book_id_seq.nextval, 250, 30)
/
... they may be puzzled why the stored DISCOUNT is different from the value they submitted. I would rather use a stored procedure to enforce business rules.
Either way, in real life I would prefer to have the rules implemented through an API rather than hard-coding the values. But that is a matter of taste.
As Jeffrey points out it is a good idea to back up the trigger (or procedure) with a check constraint on the table to guarantee that the DISCOUNT is appropriate to the price.
alter table book
add constraint book_discount_ck
check ((price > 200 and discount = 20) or discount = 0)
/
Applying a constraint without either a stored procedure or o trigger requires the user to know the business rule. Unfortunately Oracle does not provide a mechanism to attach a specific error message to our check constraint. The ability to raise a context specific exception with a meaningful message is one of the advantages of stored procedures.