在插入新行之前检查表中的重复数据

时间:2013-04-12 11:43:15

标签: oracle oracle10g oracle11g

我有表,USERS,包含以下列:     user_id,user_name,user_uname,user_pass

我需要检查user_name是否存在并返回-2,如果user_uname存在则返回-3 else插入并返回新行的插入ID。

如何在查询中执行此操作?如果使用函数我需要将查询作为参数传递给函数吗?

有没有办法加密这个功能?

3 个答案:

答案 0 :(得分:1)

为什么你需要加密这个功能呢?您的应用程序用户不应该直接访问数据库层。如果他们这样做,你需要改变它。

首先,您需要在用户名上创建UNIQUE CONSTRAINT。我个人会允许存在多个相同的用户名,但这是你的电话:

alter table your_table 
  add constraint ui_your_table_username 
      unique (username);

这将确保当您尝试插入重复项时,会引发错误。

接下来,您需要创建一个插入数据的函数。您可以使用INSERT语句中的RETURNING INTO语法来获取要插入的新ID。如果用户名已经存在,那么你要求返回-2和-3。我只会选择其中一个,因为两者都不可能。

create or replace function insert_new_user ( 
    Pusername in varchar2
  , Pother_value in varchar2 
    ) return number is

   l_user_id users.id%type;

begin

   insert into users (id, username, other_column)
   values (user_id_seq.nextval, Pusername, Pother_column)
   returning id into l_user_id;

   return l_user_id;

-- An exception is raised if the unique index is violated.
-- Catch this and use it to return the default error value.
exception when dup_val_on_index then
   return -2;

end;
/

我假设了以下内容(您没有提供太多信息):

  1. 您的用户ID列是一个数字。
  2. 你有一个序列。
  3. 您的用户表名为USERS

答案 1 :(得分:0)

你可以使用wrap实用程序包装你的函数。http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/wrap.htm

但是当您将代码动态传递给函数时,不需要包装代码

答案 2 :(得分:0)

老兄,我尝试使用触发器。这个代码可以做到,当你对表执行插入操作时,它会检查该表是否包含重复项,如果是,那么它将引发异常并中止操作。 触发器创建:

create or replace
trigger schema2.ins_tri
before insert  on schema2.users for each row
declare
  usr_ex exception;
  tmp number(30);
begin

    tmp:=schema2.ins_fun('schema2.users',:new.USER_NAME,:new.USER_UNAME );
    if(tmp!=0)
    then
    raise usr_ex;
    else 
      dbms_output.put_line('inserted successfullly');
    end if; 

exception
  when usr_ex then
      raise_application_error
            (-20001
             , 'there is some dupticate values in the table'
             , true); 
end;

返回功能: -

create or replace
function         ins_fun(table_name in varchar2,u_name varchar2,name_1 varchar2)return number 
is 
type col_1 is table of number;
c1 col_1;
type col_2 is table of  number;
c2 col_2;
type col_3 is table of  number;
c3 col_3;
begin

  select  tmp bulk collect into c1 from  (select count(*) tmp  from schema2.users u  group by (u.user_name))  where tmp>=2; 
   select  tmp bulk collect into c1 from  (select count(*) tmp  from schema2.users u where u.user_name=u_name  group by (u.user_name))  where tmp>=1;--check new insert value matches form the table
  dbms_output.put_line(c1.count||'c2 count');
  select * bulk collect into c3 from  (select count(*) tmp  from schema2.users u group by (u.user_uname))  where tmp>=2; 
   select * bulk collect into c3 from  (select count(*) tmp  from schema2.users u where u.user_uname=name_1 group by (u.user_uname))  where tmp>=1; 
    dbms_output.put_line(c3.count||'c3 count');
  if(c1.count>=1)
  then
     return -2;
  elsif(c3.count>=1)
  then
     return -3;
  else
     return 0;
  end if ;

end;

根据返回值

,您可以根据需要提出不同的异常