我有表 USERS,其中包含以下列:user_id、user_name、user_uname、user_pass
我需要检查 user_name 是否存在并返回 -2,如果 user_uname 存在则返回 -3 else insert 并返回新行的插入 id。
我怎样才能在查询中做到这一点?如果使用函数我需要将查询作为参数传递给函数?
有什么方法可以加密函数吗?
为什么你需要加密函数?您的应用程序用户不应直接访问数据库层。如果他们这样做,您需要更改此设置。
首先,您需要在用户名上创建一个唯一约束。我个人会允许存在多个相同的用户名,但这是您的决定:
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;
/
我假设了以下内容(您没有提供太多信息):
伙计,我已经通过使用 触发器尝试过。这段代码可以做到,当你对表执行插入操作时,它会检查该表是否包含重复项,如果是,那么它将引发异常并中止操作。触发器创建:
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;
如果你愿意,你可以提出不同的异常!基于返回值
你可以使用 wrap 实用程序包装你的函数。http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/wrap.htm
但是当您将代码动态传递给函数时,不需要包装您的代码