我在mysql中编写了一个过程来检查表中的任何重复值,以便不能添加相同的值。这就是:
CREATE OR REPLACE PROCEDURE add_valu (c_cntry_id IN COUNTRIES.COUNTRY_ID%TYPE,
c_cntr_name IN COUNTRIES.COUNTRY_NAME%TYPE,
c_rgn_id IN COUNTRIES.REGION_ID%TYPE)
IS
BEGIN
INSERT INTO countries(COUNTRY_ID, COUNTRY_NAME,REGION_ID)
values (user_seq.nextval, c_cntr_name,c_rgn_id);
c_cntry_id := user_seq.currval;
EXCEPTION
WHEN dup_val_on_index
THEN
c_cntry_id := null;
END;
/
有人可以帮我在oracle中编写类似的程序吗?我实际上是oracle的新手。需要一些指导。
提前致谢
答案 0 :(得分:0)
最简单的方法是尝试insert
并在违反密钥时捕获异常。假设绝大多数时候人们没有尝试插入已经存在的值,这应该是合理有效的。但是,如果对该过程的大多数调用导致异常被抛出或被捕获,那么您可能花费大部分时间进行异常处理,并且您可能希望执行merge
而不是insert
。
我已将参数名称更改为使用p_
前缀。当您的参数名称与表中列的名称冲突时,这可以节省您的错误,在这种情况下,Oracle可能会在您打算使用列名时引用该列。在您的示例中,假设name
是表中的列,对name
的每个引用都将引用表中的列,并且没有引用该过程的参数。
CREATE OR REPLACE PROCEDURE add_values (p_UserID OUT VARCHAR2,
p_name IN VARCHAR2,
p_email IN VARCHAR2,
p_extension IN VARCHAR2)
IS
BEGIN
INSERT INTO User_Info( userID, name, email, extension, create_date )
values (user_seq.nextval, p_Name,p_Email,p_Extension,sysdate);
p_userID := user_seq.currval;
EXCEPTION
WHEN dup_val_on_index
THEN
p_userID := null;
END;
如果您正在使用(或需要支持)旧版本的Oracle,则可能无法像这样分配序列的currval
。你可能必须
SELECT user_seq.currval
INTO p_userID
FROM dual;
而不是
p_userID := user_seq.currval;