предел столбца char триггер plsql - PullRequest
2 голосов
/ 22 апреля 2020

Я начинаю изучать PL SQL и создал очень очень простую таблицу, я пытаюсь ознакомиться с функциями и триггерами.

Моя таблица:

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));

Теперь к вопросу, я хочу ограничить перед вставкой или обновлением новую строку (biuefer) так, чтобы имя должно быть 8 символов, не меньше, не больше. Если вы попытаетесь вставить строку с именем длиной не более 8 символов, я хочу напечатать сообщение.

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;

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Если вы хотите реализовать такое ограничение, вы обычно используете проверочное ограничение, а не триггер:

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)
);

Примечания:

  • , что нет точка, объявляющая varchar(30), если вы все равно не разрешаете более 8 символов, поэтому я уменьшил это значение

  • , которое вы хотите varchar2 вместо varchar (этот тип данных Oracle) рекомендуется в новом коде)

  • вы должны объявить длину столбца с помощью char - по умолчанию это byte, что может иметь неожиданное поведение, если ваши данные имеют многобайтовый символы

Но так как вы объяснили, что играете вокруг и хотите научиться делать это с помощью триггера, вот как будет выглядеть код:

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;

В коде триггера вы можете использовать псевдотаблица :new для доступа к значениям, которые в данный момент обновляются или вставляются; вы бы завернули проверку в оператор if и соответственно подняли бы ошибку.

0 голосов
/ 22 апреля 2020

Используйте ограничение check:

alter table biufer_customer add constraint chk_customer_f_name
    check (length(f_name) = 8);

Триггер не подходит.

...