检查字符串是否包含任何数值

Ber*_*ing 1 sql oracle plsql

我有下表:

create table students
(
    stuName varchar2(100),
    cgpa number
);
Run Code Online (Sandbox Code Playgroud)

我的目标是创建一个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;
Run Code Online (Sandbox Code Playgroud)

我想如果upper函数是对包含任何数值的字符串进行操作,它会抛出异常.但这并没有发生,insert行动正在执行中.

And*_*ter 5

我建议使用约束而不是触发器.

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
Run Code Online (Sandbox Code Playgroud)

  • 对于这类事情,约束肯定比触发器更好. (2认同)