检查 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: 列列表无效的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式验证器检查 11 位数字或为空

php 验证PESEL

csharp NIP,REGON,PESEL Validator

如何使用正则表达式检查不应包含重复数字的手机号码

安装oracle后登录时出现 ERROR: ORA-01031 insufficient privileges

如何有效地检查数字二进制表示中所有下一位是不是不同?