Oracle 使用触发器在插入前进行PL SQL验证

Oracle 使用触发器在插入前进行PL SQL验证,oracle,plsql,Oracle,Plsql,我最近开始学习一些关于数据库的知识,我正在努力使varchar2在被插入数据库之前被验证为所有字母字符(没有数字或特殊字符)。我似乎找不到确切的方法,我有一个触发器和一个函数,但当我尝试插入一个包含特殊字符的字符串时,它允许这样做。我希望有人能帮助我,我将不胜感激 我的代码如下 CREATE OR REPLACE FUNCTION isAlpha (al IN VARCHAR2) RETURN CHAR IS BEGIN FOR i in 1..LENGTH(al) LOOP IF ASCII(

我最近开始学习一些关于数据库的知识,我正在努力使varchar2在被插入数据库之前被验证为所有字母字符(没有数字或特殊字符)。我似乎找不到确切的方法,我有一个触发器和一个函数,但当我尝试插入一个包含特殊字符的字符串时,它允许这样做。我希望有人能帮助我,我将不胜感激

我的代码如下

CREATE OR REPLACE FUNCTION isAlpha (al IN VARCHAR2) RETURN CHAR IS
BEGIN
FOR i in 1..LENGTH(al) LOOP
IF ASCII(SUBSTR(al, i, 1)) < 65 OR ASCII(SUBSTR(al, i, 1)) > 90
THEN RETURN 'F';
END IF;
END LOOP;
RETURN 'T';
END isAlpha;

CREATE OR REPLACE TRIGGER valid_name 
BEFORE INSERT OR UPDATE ON ACCOUNT
FOR EACH ROW
BEGIN
IF (ISALPHA(:new.name) = 'F') THEN
raise_application_error(-20001, 'Not valid name');
END IF;
END;
创建或替换函数isAlpha(VARCHAR2中的al)返回字符为
开始
对于1.长度(al)循环中的i
如果ASCII(SUBSTR(al,i,1))<65或ASCII(SUBSTR(al,i,1))>90
然后返回“F”;
如果结束;
端环;
返回'T';
伊萨尔法末端;
创建或替换触发器有效的\u名称
在插入或更新帐户之前
每行
开始
如果(ISALPHA(:new.name)='F'),那么
引发应用程序错误(-20001,“无效名称”);
如果结束;
结束;

它编译得很好,但在运行时似乎不起作用,而且我对Oracle SQL相当陌生,所以我还不知道如何调试。

很抱歉这个愚蠢的问题。我的函数使用大写字母,而不使用小写字母,所以当我尝试插入
insert-into-ACCOUNT(id,cid,name)值(2,4,'Brent')
它不允许我这样做,因为我的函数在找到
r
时会返回
F


无论如何,修复是
IF(ISALPHA(UPPER(:new.name))='F'),那么

Mysql和sql server与oracle是不同的产品。请注意您使用的标签!空格不是字母字符。我还想要自己的实现,而不是复制别人的作品。我正在努力学习语法。