创建检查ID是否唯一的函数

时间:2014-12-18 14:06:20

标签: function plsql

我想创建一个函数,检查我将插入的ID是否唯一。 这就是我所做的:

-- the function has to return true if ID is unique and false if ID is allready used(not unique)

  CREATE OR REPLACE FUNCTION Check_uniqueID
    ( p_ID IN STORE."ID"%TYPE)
    RETURN BOOLEAN
    AS 
      v_IsUnique BOOLEAN := FALSE;
    BEGIN
      ALTER TABLE STORE
      ADD CONSTRAINT check_unique_id UNIQUE (p_ID);
      -- how can i programm that he returns true if its unique and false if its not?
      v_IsUnique := TRUE;
      RETURN v_IsUnique;
    END;

提前致谢!

3 个答案:

答案 0 :(得分:3)

这里唯一的好习惯是使用唯一约束和序列。添加约束(您需要执行一次):

ALTER TABLE STORE ADD CONSTRAINT check_unique_id UNIQUE (p_ID);

为ID创建序列(一次):

create sequence my_sequence;

INSERT声明中使用它:

insert into STORE (id, another_field) 
values (my_sequence.nextval, 'some value for another field');

或:

insert into STORE (id, another_field) 
select my_sequence.nextval, one_more_field
  from some_table;

如果您不想使用序列,则需要处理异常ORA-00001

答案 1 :(得分:1)

在函数中使用ALTER TABLE只是为了检查是否违反约束是非常糟糕的做法。您应该永久地对表有约束,并在抛出它时处理ORA-00001: unique constraint (constraint_name) violated异常。您似乎也误解了ALTER TABLE的语法,因为您尝试在STORE.p_ID的不存在列上添加约束。

但是,如果必须使用函数来重现数据库通过检查约束提供的功能(用于UI中的预验证或类似功能),这将起作用:

CREATE OR REPLACE FUNCTION check_uniqueid (p_id IN NUMBER)
RETURN BOOLEAN
AS
   li_count PLS_INTEGER;
BEGIN
   SELECT   COUNT(1)
   INTO     li_count
   FROM     store s
   WHERE    s.id = p_id;

   RETURN li_count = 0;
END;

答案 2 :(得分:0)

您可以使用SELECT查询来检查该值是否已存储在表中。