甲骨文;限制每列列的行数

编程入门 行业动态 更新时间:2024-10-28 13:17:55
本文介绍了甲骨文;限制每列列的行数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

CREATE TABLETEST (IDNUMBER(10)NOT NULL ENABLE,POSTALCODEVARCHAR2(6)NOT NULL ENABLE, .... CONSTRAINTTEST_PK PRIMARY KEY(ID)ENABLE )

我正在尝试创建一个触发器限制具有重复邮政编码的记录数量;只有两行可能同时包含相同的邮政编码。 我尝试了以下代码:

CREATE OR REPLACE TRIGGER TR_TEST_PC 在POSTALCODE更新或插入之前ONTEST FOR EACH ROW WHEN(OLD.POSTALCODE<> NEW.POSTALCODE) DECLARE v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM TEST WHERE POSTALCODE =:NEW.POSTALCODE; IF(v_count> 2)THEN raise_application_error(-20000,'最多2行,具有相同的邮政编码'); END IF; END TR_TEST_PC;

但这会返回错误:

ORA-04091:表MYDB.TEST是突变,触发器/功能可能看不到 ORA-06512:在MYDB.TR_TEST_PC,第4行 ORA- 04088:执行触发器时出错'MYDB.TR_TEST_PC'

我明白这是因为你不能访问您变异的表。

如何创建一个触发器,确保不超过2个记录包含相同的邮政编码?

创建或替换触发器TR_TEST_PC 测试后的POSTALCODE更新或插入 DECLARE v_count NUMBER; BEGIN SELECT MAX(COUNT(*)) INTO v_count FROM TEST GROUP BY POSTALCODE; IF(v_count> 2)THEN raise_application_error(-20000,'最多2行,具有相同的邮政编码'); END IF; END TR_TEST_PC;

I have a table with a postal code column (Dutch format, but never mind that)

CREATE TABLE "TEST" ( "ID" NUMBER(10) NOT NULL ENABLE, "POSTALCODE" VARCHAR2(6) NOT NULL ENABLE, .... CONSTRAINT "TEST_PK" PRIMARY KEY ("ID") ENABLE )

I'm trying to create a trigger that limits the number of records with duplicate postal codes; only two rows may contain the same postal code at once. I tried the following code:

CREATE OR REPLACE TRIGGER TR_TEST_PC BEFORE UPDATE OR INSERT OF "POSTALCODE " ON "TEST" FOR EACH ROW WHEN ( OLD.POSTALCODE <> NEW.POSTALCODE ) DECLARE v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM TEST WHERE POSTALCODE = :NEW.POSTALCODE ; IF (v_count > 2) THEN raise_application_error(-20000, 'Max. 2 rows with same postal code.'); END IF; END TR_TEST_PC;

But this returns an error:

ORA-04091: table MYDB.TEST is mutating, trigger/function may not see it ORA-06512: at "MYDB.TR_TEST_PC", line 4 ORA-04088: error during execution of trigger 'MYDB.TR_TEST_PC'

I understand this is because you can't access a table you're mutating.

How can I make a trigger that ensure no more than 2 records contain the same postal code?

解决方案

I ended up using an after-update trigger instead:

CREATE OR REPLACE TRIGGER TR_TEST_PC AFTER UPDATE OR INSERT OF "POSTALCODE" ON "TEST" DECLARE v_count NUMBER; BEGIN SELECT MAX(COUNT(*)) INTO v_count FROM TEST GROUP BY POSTALCODE; IF (v_count > 2) THEN raise_application_error(-20000, 'Max. 2 rows with same postal code.'); END IF; END TR_TEST_PC;

更多推荐

甲骨文;限制每列列的行数

本文发布于:2023-06-10 23:02:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/620953.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:甲骨文   行数

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!