gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:57:27 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com