知識點一 oracle 不能直接設定主鍵自增
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB1ENnpnT5lleNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0IDNwADN0AjMwEjMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
圖檔在這裡,可以看到。并沒有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;