知识点一 oracle 不能直接设置主键自增
图片在这里,可以看到。并没有mysql那样有主键递增
要实现主键递增,要用到序列和触发器的组合
首先放出我建立的数据表
创建序列
CREATE SEQUENCE AUTO_ADD_ID INCREMENT BY 2 MAXVALUE 999999999 MINVALUE 1 NOCACHE;
这一句的意思是我创建了一个名字叫 AUTO_ADD_ID的序列,每次自增2,最大999999999,最小1,不缓存。
建立触发器
create or replace TRIGGER USER_AUTO_ID
BEFORE INSERT ON USERLOGIN for each row
BEGIN
select auto_add_id.nextval into :new.userid from dual;
END;
auto_add_id.nextval是从序列里拿出下一个值,into :new.userid 意思是把拿出来的值付给,我在insert的时候
将要添加的userid字段的值(简单来说就是触发器在insert的时候执行,执行从序列里抽取下一个值,付给我想设置的自增字段,针对这个insert的一条记录)
测试加结果
自动加上,成功。
知识点二
– 存储过程 不应用 select 语句中 执行 应该 单独在pl/sql 块里执行
– 函数 里不能有update delete insert 语句 这些应放在存储过程中执行 可以在select语句中调用
最后把练习写出的几个oracle存储过程和函数分享下来
- 触发器add_createdate在添加用户时触发 自动添加用户创建日期
- 函数LOGINCHECK 检查用户名密码知否对应 对应返回1,否则返回0,出现异常情况返回2
- 最后一次登录的时间,根据用户名添加 相当于日志功能
- 这个代码块是我想的一个全员用户积分成倍增加或减少的功能,然后算出来增加了多少,减少了多少。
create or replace PROCEDURE RICHESINCREASE
(
V_INDEX IN NUMBER
, V_SUM OUT NUMBER
)
is
cursor riches_cursor is select userid,riches from userlogin ;
-- v_index_tem number(10):=1;
BEGIN
v_sum := 0;
-- 求出增加或减少的积分
if v_index >1 then
-- 求出 增加或减少总量
for c in riches_cursor loop
v_sum:=v_sum + c.riches*(v_index-1);
update userlogin set riches = riches*V_INDEX where userid = c.userid;
end loop;
elsif v_index >0 then
-- 求出 增加或减少总量
for c in riches_cursor loop
v_sum:=v_sum + c.riches*(1-v_index);
update userlogin set riches = riches*V_INDEX where userid = c.userid;
end loop;
end if;
-- 正负转换
if V_INDEX >=1 then v_sum := v_sum;
elsif V_INDEX>=0 then v_sum := -v_sum;
end if;
END RICHESINCREASE;