过程“添加非重复列值”oracle

时间:2015-11-27 20:37:34

标签: oracle

我在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的新手。需要一些指导。

提前致谢

1 个答案:

答案 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;