I’m starting to learn PLSQL and created a very very simple table, I’m trying to get familiar with functions and triggers.
My table:
create table customer( f_name varchar(30) not null, s_name varchar(30) not null, passwd varchar(20) not null, constraint customer_f_name_pk primary key (f_name));
Now to the question, I want to limit before insert or update new row (biuefer) so that the first name must be 8 characters, not less, not more. If you try to insert a row with a name less or more than 8 character I want a message printed out.
create or replace trigger biufer_customer before insert or update of f_name on customer for each row begin *NO IDEA WHAT TO TYPE* raise_application_error(-20001,'So I type my text here'); end;
Advertisement
Answer
If you wanted to implement such constraint, you would typically use a check constraint rather than a trigger:
create table customer( f_name varchar2(8 char) not null check(length(f_name) = 8)) s_name varchar2(30 char) not null, passwd varchar2(20 char) not null, constraint customer_f_name_pk primary key (f_name) );
Notes:
that there is no point declaring a
varchar(30)
if you don’t allow more than 8 characters anyway, so I shrinked thatyou want
varchar2
rather thanvarchar
(this Oracle datatype is recommended in new code)you should declare the lenght of the column with
char
– the default isbyte
, which can have suprising behavior if your data has multi-byte characters
But since you explained that you are playing around and want to learn how to do that with a trigger, here is how the code would look like:
create or replace trigger biufer_customer before insert or update of f_name on customer for each row begin if (length(:new.f_name) <> 8) then raise_application_error(-20001,'So I type my text here'); end if; end;
Within the trigger code, you can use pseudo table :new
to access the values that are currently being updated or inserted; you would wrap the check in a if
statement and raise the error accordingly.