Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 检查字符串是否包含任何数值_Sql_Oracle_Plsql - Fatal编程技术网

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

Sql 检查字符串是否包含任何数值,sql,oracle,plsql,Sql,Oracle,Plsql,我有下表: 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 v

我有下表:

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;

我认为如果上层函数对包含任何数值的字符串进行操作,它会抛出异常。但这并没有发生,插入操作正在执行。

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

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

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

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

如果不希望替换,但检查并引发错误,则可以使用并在结果不为null时引发错误:

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

如果不希望替换,但检查并引发错误,则可以使用并在结果不为null时引发错误:

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

不,upper不会修改字符串中非小写字符的字符。不,upper不会修改字符串中非小写字符的字符。对于这类事情,约束绝对优于触发器。对于这类事情,约束绝对优于触发器。