Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
如何捕获PL/SQL中的约束冲突?_Sql_Oracle_Plsql_Constraints_Check Constraint - Fatal编程技术网

如何捕获PL/SQL中的约束冲突?

如何捕获PL/SQL中的约束冲突?,sql,oracle,plsql,constraints,check-constraint,Sql,Oracle,Plsql,Constraints,Check Constraint,我用约束创建了上面的表。 现在,我想通过在异常中捕获这些约束来测试PL/SQL过程中的约束。但是我不知道怎么做。违反检查约束时发生的错误是ORA-02290。虽然没有“标准”的定义,但是声明自己的异常非常容易,这样就可以在抛出-2290时捕获它。假设我们创建了一个表,如下所示: CREATE TABLE LOCATION ( LOCID VARCHAR2(5) , MINQTY NUMBER , MAXQTY NUMBER , PRIMARY KEY (LOCID) , CO

我用约束创建了上面的表。
现在,我想通过在异常中捕获这些约束来测试PL/SQL过程中的约束。但是我不知道怎么做。

违反检查约束时发生的错误是ORA-02290。虽然没有“标准”的定义,但是声明自己的异常非常容易,这样就可以在抛出-2290时捕获它。假设我们创建了一个表,如下所示:

CREATE TABLE LOCATION (
  LOCID VARCHAR2(5)
, MINQTY    NUMBER
, MAXQTY    NUMBER
, PRIMARY KEY   (LOCID)
, CONSTRAINT CHECK_LOCID_LENGTH CHECK (LENGTH(LOCID) = 5)
, CONSTRAINT CHECK_MINQTY_RANGE CHECK (MINQTY BETWEEN 0 AND 999)
, CONSTRAINT CHECK_MAXQTY_RANGE CHECK (MAXQTY BETWEEN 0 AND 999)
, CONSTRAINT CHECK_MAXQTY_GREATER_MIXQTY CHECK (MAXQTY >= MINQTY)
);


CREATE OR REPLACE PROCEDURE ADD_LOCATION_TO_DB(ploccode VARCHAR2, pminqty NUMBER, pmaxqty NUMBER) AS
BEGIN
INSERT INTO location(locid, minqty, maxqty) VALUES (ploccode, pminqty, pmaxqty);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
RAISE_APPLICATION_ERROR(-20081, 'Duplicate Location ID');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20086,sqlerrm);
END;
然后我们运行以下程序块:

CREATE TABLE SOME_TABLE (COL1 CHAR(1) CHECK(COL1 IN ('Y', 'N')));
如果如前所示创建表,然后运行上面的块,您会发现DBMS_输出上将显示“由于检查约束冲突而导致插入失败”一行


共享和享受。

不使用PL/SQL。您需要it和it的解决方案吗?我希望PL/SQL代码用于在位置表中插入一行的过程,并希望测试该PL/SQL过程中的约束。但是我不确定如何检查约束的代码。是的,但是您已经用两种不同的产品标记了这个问题,其中一种产品甚至没有PL/SQL。您真的需要这两种产品的解决方案吗?我删除了sql server标记,因为问题显然是关于Oracle和PL/sql的。检查约束冲突没有预定义的异常(请参见此处:)您需要检查
when others
handler中的错误代码如果表中有多个检查约束,是否有方法确定违反了哪个约束?我相信约束的名称将与其他文本一起出现在SQLERRM中。您可以如上所示打印SQLERRM,或者解析文本以查找约束名称。
DECLARE
  -- First, declare and initialize an appropriate exception

  CHECK_CONSTRAINT_VIOLATED EXCEPTION;
  PRAGMA EXCEPTION_INIT(CHECK_CONSTRAINT_VIOLATED, -2290);
BEGIN
  INSERT INTO SOME_TABLE(COL1) VALUES ('X');  -- will violate the check constraint
  RETURN;
EXCEPTION
  WHEN CHECK_CONSTRAINT_VIOLATED THEN  -- catch the ORA-02290 exception
    DBMS_OUTPUT.PUT_LINE('INSERT failed due to check constraint violation');
  WHEN OTHERS THEN                     -- catch all other exceptions
    DBMS_OUTPUT.PUT_LINE('Something else went wrong - ' || SQLCODE ||
                         ' : ' || SQLERRM);
END;