我想创建一个函数,检查我将插入的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;
提前致谢!
答案 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查询来检查该值是否已存储在表中。