我需要编写这样一个触发器来检查此人的姓名,如果这些人的姓名中有任何数字,则打印出他/她的 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/