0

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

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

我怎样才能在查询中做到这一点?如果使用函数我需要将查询作为参数传递给函数?

有什么方法可以加密函数吗?

4

3 回答 3

1

为什么你需要加密函数?您的应用程序用户不应直接访问数据库层。如果他们这样做,您需要更改此设置。

首先,您需要在用户名上创建一个唯一约束。我个人会允许存在多个相同的用户名,但这是您的决定:

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
于 2013-04-12T12:06:16.393 回答
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;

如果你愿意,你可以提出不同的异常!基于返回值

于 2013-04-12T14:00:07.993 回答
0

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

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

于 2013-04-12T12:28:04.880 回答