sql - 使用触发器检查 VARCHAR2 是否仅包含字母

标签 sql database loops plsql triggers

我需要编写这样一个触发器来检查此人的姓名,如果这些人的姓名中有任何数字,则打印出他/她的 ID。

我现在拥有的:

set SERVEROUTPUT ON
create or replace trigger BeforeUpdate
Before insert on customer
for each row 

declare 
n varchar2(10);
counter number;
nextR number:=0;

begin
select count(id_customer) into counter from customer;

LOOP
nextR:= nextR +1;
select cname into n from customer where id_customer = nextR;
if n not like '%[0-9]%' then 
DBMS_OUTPUT.PUT_LINE(nextR || ' has incorrect name');
end if;
exit when nextR = counter;
end loop;
end;
/

它会编译,当我尝试触发此触发器时它什么也不做。

如有任何帮助,我将不胜感激。

最佳答案

您的代码中有几个问题:

  • 在触发器中使用 dbms_output 没有任何意义;通常,INSERT 将由不处理控制台输出的客户端代码执行。 明智的做法是引发异常。
  • 您不需要在触发器代码中执行SELECT。事实上,这样做通常要么是多余的,要么会引发变异表错误。相反,使用 :new 和 :old 来引用插入行的值
  • (次要)命名插入前触发器 BeforeUpdate 有点令人困惑
  • 使用正则表达式来测试此业务规则(严肃地说;正则表达式规则用于此类事情)

总而言之,这是固定版本(未经测试,我现在没有可用于测试的 Oracle 实例):

create or replace trigger TR_BI_CUSTOMER
Before insert on customer
for each row 
begin
  if regexp_like(:new.name, '.*[0-9].*') then 
    raise_application_error(-20001, 'Incorrect name: ' || :new.name);
  end if;
end;

关于sql - 使用触发器检查 VARCHAR2 是否仅包含字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37734575/

相关文章:

MySQL' INSERT ... ON DUPLICATE KEY UPDATE 主键限制

c - 在Winsock中为recv()做while循环

Linux Bash Shell 读取日志文件将每一行与文件的重置进行比较

java - SQL 查询使用大量资源但没有结果

python - 同时提供代码和数据库

database - 在服务器中实现自动完成的最佳方式是什么?

c++ - 程序陷入循环

MySQL where 条件与 2 个值相交(逗号分隔)

mysql - SQL获取单行中不为零的列

php - MySQL Workbench 5.6 在连接到本地主机时崩溃