我有表,USERS,包含以下列: user_id,user_name,user_uname,user_pass
我需要检查user_name是否存在并返回-2,如果user_uname存在则返回-3 else插入并返回新行的插入ID。
如何在查询中执行此操作?如果使用函数我需要将查询作为参数传递给函数吗?
有没有办法加密这个功能?
答案 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 :(得分: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;
根据返回值
,您可以根据需要提出不同的异常