Проверка, содержит ли строка числовые значения - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть следующая таблица:

create table students
(
    stuName varchar2(100),
    cgpa number
);

Моя цель - создать триггер PL / SQL, который будет срабатывать, если кто-нибудь попытается ввести имя, содержащее какие-либо числовые значения.Моя попытка:

create or replace trigger invalid_name
before insert
on students
for each row
declare
    vName varchar2(100);
begin
    vName := :new.stuName;
    if upper(vName) like upper(vName) then
        vName := initcap(vName);
    end if;
exception
    when value_error then
        dbms_output.put_line('ERROR: Name contains numeric value(s).');
end;

Я подумал, что если функция upper будет воздействовать на строку, содержащую любое числовое значение, она выдаст исключение.Но этого не происходит, и insert действие выполняется.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Если вы не хотите заменять, но проверить и вызвать ошибку, вы можете использовать этот трюк и вызвать ошибку, если результат не равен нулю:

SELECT LENGTH(TRIM(TRANSLATE('123b', ' +-.0123456789',' '))) FROM dual;
Result: 1

SELECT LENGTH(TRIM(TRANSLATE('a123b', ' +-.0123456789',' '))) FROM dual;
Result: 2

SELECT LENGTH(TRIM(TRANSLATE('1256.54', ' +-.0123456789',' '))) FROM dual;
Result: null

SELECT LENGTH(TRIM(TRANSLATE ('-56', ' +-.0123456789',' '))) FROM dual;
Result: null
0 голосов
/ 21 декабря 2018

Я бы предложил использовать ограничение, а не триггер.

create table foo (
    name varchar2(100) NOT NULL
    constraint name_non_numeric check ( not regexp_like( name, '[0-9]' ) )
);

Table created.

insert into foo ( name ) values ( 'Andy' );

1 row created.

> insert into foo ( name ) values ( 'Logan 5' );

insert into foo ( name ) values ( 'Logan 5' )
*
ERROR at line 1:
ORA-02290: check constraint (NAMESPACE.NAME_NON_NUMERIC) violated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...