星期日, 六月 15, 2008

oracle筆記

會碰到oracle是因為專題,內建的webmin(IEonly xd)和PL/SQL,但一般使用還是mysql比較簡單吧:q

畢竟使用群不同,像是之前要找一個oracle client+ER diagram產生,找到的都是商業軟體超貴,不像mysql有一海票

然後呀,oracle現在XE版是免費自由使用的,其他版本用在開發上也都可以免費下載使用。其實這已經是很久很久以前的新聞了,只是好像很多人還是不知道。

引述鄉民推文:

→ westlife138 推:oracle不是超貴@@ 08/06/12
→ easy 推:嘖嘖..應該是水貨 XD 08/06/12

連上database課的老師上課都在那邊說學校買不起超好笑,專題展報專題也被評審質問我們oracle是不是正版的orz

有時候感覺教授們除了conference、journal、paper上得東西以外,其他資訊和業界動態真的有點lag xd

以下只是個人筆記,應該很多人寫過了文件也有(不知道為甚麼連oracle官網超慢),based on Oracle 11g XE

一.流水號
oracle不能像mysql簡單產生流水號,必須要新增"sequence"再用"trigger"去產生

1.建立sequence

CREATE SEQUENCE "TRANSACTION_SEQ" MINVALUE 1024 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1144 NOCACHE ORDER NOCYCLE
以上SQL建立一個sequence "TRANSACTION_SEQ",範圍1024~999999999999999999999999999,從1144開始

特別要注意的是要NOCACHE要不然號碼會亂跳,而且每個relational schema通常要對應一個專用的sequence。

2.建立trigger

CREATE OR REPLACE TRIGGER "BANKINFORM_T1" 
BEFORE
insert on "BANKINFORM"
for each row
begin
SELECT BANK_INFORM1_SEQ.NEXTVAL INTO :NEW.NO FROM DUAL;
end;

以上sql code 建立trigger "BANKINFORM_T1",他會在"BANKINFORM"這個table做insert前在要insert的"NO"這個欄位自動插入流水號,即使你的insert on語句有對"NO"設定值也會被蓋掉(因為是再妳輸入指令之後才激發他的trigger)。

二. 欄位預設值
跟流水號很像,只是輸入的是constant

CREATE OR REPLACE TRIGGER "BANKINFORM_T1" 
BEFORE
insert on "BANKINFORM"
for each row
begin
SELECT 0 INTO :NEW.NO FROM DUAL;
end;

"NO"會自動填入預設值為0

三.時戳

CREATE OR REPLACE TRIGGER "LOG_T2" 
BEFORE
insert on "LOG"
for each row
begin
SELECT systimestamp INTO :NEW.TIME FROM DUAL;
end;
於"TIME"欄位自動填入系統現在時間

四. table間資料同步

CREATE OR REPLACE TRIGGER "TRANSACTION_ACCT_UPDATE" 
AFTER 
insert ON transaction_acct

FOR EACH ROW
DECLARE
  v_no TRANSACTION_ACCT.ACCOUNT_NO%TYPE;
  v_balance0 ACCOUNT.BALANCE%TYPE;
  v_withdrawal TRANSACTION_ACCT.WITHDRAWAL%TYPE;
  v_deposit TRANSACTION_ACCT.DEPOSIT%TYPE;

BEGIN
  v_deposit := :new.DEPOSIT;
  v_withdrawal := :new.WITHDRAWAL;
  v_no := :new.ACCOUNT_NO;

  SELECT ACCOUNT.BALANCE
  INTO v_balance0
  FROM ACCOUNT
  WHERE ACCOUNT.NO= v_no;

  update ACCOUNT 
  set ACCOUNT.BALANCE=(v_balance0+v_deposit-v_withdrawal) 
  where ACCOUNT.NO=v_no;

END;

這一個trigger會在"TRANSACTION_ACCT"插入交易紀錄後,依據交易紀錄自動跟新"ACCOUNT"這個table的balance欄位,其實就是
balance=balance+deposit-withdrawal;

其實很多事都可以在應用端eg. PHP簡單解決,只是能在database上就搞定也不錯。

其實一般應用還是PHP+mysql才是王道呀
小公司或學校計中都是找這種人,我報JavaEE+oracle就被刷掉了(翻桌)

0 意見: