Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 引发应用程序错误的PLSQL触发器不工作_Oracle_Plsql_Triggers - Fatal编程技术网

Oracle 引发应用程序错误的PLSQL触发器不工作

Oracle 引发应用程序错误的PLSQL触发器不工作,oracle,plsql,triggers,Oracle,Plsql,Triggers,我正在尝试创建一个触发器,如果行总数超过10,则会引发错误,plsql代码已成功编译,但不会生成任何错误。 这是plsql代码: SQL> CREATE OR REPLACE TRIGGER customer_count_check 2 BEFORE INSERT OR UPDATE ON customer2 3 FOR EACH ROW 4 DECLARE 5 count_customer NUMBER; 6 max_customer NUMBER := 1

我正在尝试创建一个触发器,如果行总数超过10,则会引发错误,plsql代码已成功编译,但不会生成任何错误。 这是plsql代码:

SQL> CREATE OR REPLACE TRIGGER customer_count_check
  2  BEFORE INSERT OR UPDATE ON customer2
  3  FOR EACH ROW
  4  DECLARE
  5  count_customer NUMBER;
  6  max_customer NUMBER := 10;
  7  BEGIN
  8  SELECT COUNT(*) INTO count_customer FROM customer2 WHERE cusid = :new.cusid;
  9  IF count_customer >= max_customer THEN
 10  RAISE_APPLICATION_ERROR (-20000,'Customer Table capacity exceeded');
 11  END IF;
 12  END;
 13  /

我想说您的触发器并没有像您期望的那样工作,因为您的select语句总是返回一行

你在一个主键上过滤

这应该行得通

SQL> CREATE OR REPLACE TRIGGER customer_count_check
  2  BEFORE INSERT OR UPDATE ON customer2
  3  FOR EACH ROW
  4  DECLARE
  5  count_customer NUMBER;
  6  max_customer NUMBER := 10;
  7  BEGIN
  8  SELECT COUNT(*) INTO count_customer FROM customer2; --WHERE cusid = :new.cusid;
  9  IF count_customer >= max_customer THEN
 10  RAISE_APPLICATION_ERROR (-20000,'Customer Table capacity exceeded');
 11  END IF;
 12  END;
 13  /

我想说您的触发器并没有像您期望的那样工作,因为您的select语句总是返回一行

你在一个主键上过滤

这应该行得通

SQL> CREATE OR REPLACE TRIGGER customer_count_check
  2  BEFORE INSERT OR UPDATE ON customer2
  3  FOR EACH ROW
  4  DECLARE
  5  count_customer NUMBER;
  6  max_customer NUMBER := 10;
  7  BEGIN
  8  SELECT COUNT(*) INTO count_customer FROM customer2; --WHERE cusid = :new.cusid;
  9  IF count_customer >= max_customer THEN
 10  RAISE_APPLICATION_ERROR (-20000,'Customer Table capacity exceeded');
 11  END IF;
 12  END;
 13  /

对我有效:你能提供一把小提琴来显示它是如何不起作用的吗?嘿@sticky bit我们在一个空表中创建这种类型的触发器有什么限制吗?对我来说似乎也不错。尝试用一个简单的
DBMS\u输出来替换
RAISE\u APPLICATION\u ERROR
。放一行
SELECT
看看你的
SELECT是否工作正常?@Ajax:没有。但是看看hotfix的答案,这似乎很有道理。对我有用:你能提供一把小提琴来显示它是如何不起作用的吗?嘿@sticky bit我们在空表中创建这种类型的触发器有什么限制吗?对我来说似乎也很好。试着用一个简单的
DBMS\u输出来替换
RAISE\u APPLICATION\u ERROR
。把
SELECT
放进去,看看你的
SELECT是否工作正常?@Ajax:没有。但是看看hotfix的答案,这似乎很有道理。