正如其他人所说的那样,以前版本的触发器的问题在于,当您需要将字符串的长度与值进行比较时,您将字符串与数字进行比较。我不会就此进一步细节。
当前错误的原因是您没有对用户定义的错误使用有效的错误代码。每the documentationRAISE_APPLICATION_ERROR
过程采取-20000
到-20999
范围内的错误代码。将错误代码更改为-20001
和the trigger will work。
我有点惊讶,你得到了错误,你是。我希望你能得到"ORA-21000: error number argument to raise_application_error of 1 is out of range"
,可以证明in this SQL Fiddle。这可能是因为你在最后一个分号后有一个稍微狡猾的角色。当我在文本编辑器中查看它时,它显示一个Hex格式的空间,但是当我将它复制到SQL Fiddle时,它可能不会显示。这也可能是Stack Exchange的渲染引擎的一种制造。
顺便说一下,0001
是而不是一个有效的Oracle错误代码; 00001
是唯一违反约束条件,将被声明为-00001
(注意减号)。
但是,这不是我如何去做这件事。触发器在使用时会产生额外的开销并混淆可能在数据库中声明的约束。级联触发器总是存在危险,这可能会使您的数据模型非常复杂。
更简单的方法是声明您的POSTCODE
列最多为8个字符/字节(由您决定),并在列上添加check constraint以确保邮编长度为6个字符(或字节)或更大。这将您需要的逻辑嵌入到表的结构中(从而嵌入到Oracle的元数据中),使其更容易看到发生了什么。
如果你申报你的表DDL为类似下面的(显然大规模简化):
create table location (
id number
, postcode varchar2(8)
, constraint pk_location primary key (id)
, constraint ck_location_postcode check (length(postcode) between 6 and 8)
)
然后你就可以达到同样的效果(working SQL Fiddle)。请注意,列POSTCODE
的最大长度为8,它处理上限,并且还有一个限制它的进一步检查约束。我已经定义了检查约束来处理上下限,以便将来可以告诉你8是上限。因此,对列大小的更改不会破坏您的约束。这是一个安全功能,仅此而已,它可以在不改变功能如下声明:
, constraint ck_location_postcode check (length(postcode) >= 6)
来源
2015-01-04 18:25:26
Ben
你触发了名字'loc_postcode'但你的错误消息提到了一个名为'LOC_ID'触发 - 有一个错误与也触发? – 2015-01-04 16:00:54