检查 PESEL 仅为 11 位数字 - ORA-04073: 列列表无效
Posted
技术标签:
【中文标题】检查 PESEL 仅为 11 位数字 - ORA-04073: 列列表无效【英文标题】:check PESEL is of 11 digits only - ORA-04073: column list not valid 【发布时间】:2016-01-20 07:36:11 【问题描述】:我需要一个触发器来检查 PESEL 是否只有 11 位数字(没有字母或其他符号)。 请帮我更正我的代码,我收到“ORA-04073: column list not valid for this trigger type”
CREATE OR REPLACE TRIGGER Spr_PESEL
BEFORE INSERT OF PESEL
ON OSOBA
FOR EACH ROW
DECLARE
v_num NUMBER;
BEGIN
v_num := (SELECT is_number(:NEW.PESEL) FROM dual);
IF v_num =0 OR LENGTH(:NEW.PESEL)<> 11 THEN
Raise_application_error(-20201,'PESEL=' ||:NEW.PESEL|| ' is not of 11 digits');
END IF;
END;
/
【问题讨论】:
错误发生在哪一行? (Oracle 应将此信息与错误消息一起提供)。 没有行指示符:错误报告 - ORA-04073:列列表对于此触发器类型无效 04073. 00000 -“列列表对于此触发器类型无效” *原因:为非更新触发器类型指定了列列表。 *操作:删除列列表。 【参考方案1】:您可以使用简单的检查约束代替触发器:
SQL> CREATE TABLE Osoba(
2 PESEL varchar2(11),
3 CONSTRAINT PESEL_MUST_HAVE_11_DIGITS
4 CHECK( length( PESEL ) = 11
5 and length( trim( translate( pesel, '0123456789', ' ' ))) = 0 )
6 );
Table created.
SQL> INSERT INTO osoba VALUES( '01234567890' );
1 row created.
SQL> INSERT INTO osoba VALUES( 'A1234567890' );
INSERT INTO osoba VALUES( 'A1234567890' )
*
ERROR at line 1:
ORA-02290: check constraint (TEST.PESEL_MUST_HAVE_11_DIGITS) violated
SQL> INSERT INTO osoba VALUES( '127890' );
INSERT INTO osoba VALUES( '127890' )
*
ERROR at line 1:
ORA-02290: check constraint (TEST.PESEL_MUST_HAVE_11_DIGITS) violated
SQL> select * from osoba;
PESEL
-----------
01234567890
SQL> update osoba set pesel = '01234abcdef';
update osoba set pesel = '01234abcdef'
*
ERROR at line 1:
ORA-02290: check constraint (TEST.PESEL_MUST_HAVE_11_DIGITS) violated
【讨论】:
以上是关于检查 PESEL 仅为 11 位数字 - ORA-04073: 列列表无效的主要内容,如果未能解决你的问题,请参考以下文章
csharp NIP,REGON,PESEL Validator