| 項目 | Oracle 語法 | 說明 |
|---|---|---|
| 變量聲明 | DECLARE msg VARCHAR2(22); cnt NUMBER := 0; | DECLARE 區塊,可帶初始值 |
| 取新/舊值 | :NEW.col_name / :OLD.col_name | DML 觸發器專用,:NEW 在 INSERT/UPDATE 中有效 |
| IF-ELSE | IF cond THEN ... ELSIF ... ELSE ... END IF; | PL/SQL 標準流程控制 |
| 字符串截取 | SUBSTR(str, pos, len) | SQL Server: SUBSTRING(str, pos, len) |
| 字符串替換 | REPLACE(str, old, new) | 兩者語法相同 |
| 字符串拼接 | str1 || str2 | SQL Server: str1 + str2 |
| 日期→字符串 | TO_CHAR(date, 'YYYYMMDD') | SQL Server: CONVERT(VARCHAR, date, 112) |
| 字符串→日期 | TO_DATE(str, 'YYYY-MM-DD') | SQL Server: CONVERT(DATETIME, str) |
| 當前時間 | SYSDATE | SQL Server: GETDATE() |
| 輸出調試 | DBMS_OUTPUT.PUT_LINE(msg) | SQL Server: PRINT msg |
| 單行查詢賦值 | SELECT col INTO var FROM ... | SQL Server: SELECT @var=col FROM ... |
| 語句結束符 | **每句必須分號** | SQL Server 可省略 |
| 自增列實現 | Sequence + BEFORE INSERT Trigger | SQL Server: IDENTITY(1,1) |
CREATE OR REPLACE TRIGGER t_table_trigger
AFTER INSERT ON t_table
FOR EACH ROW
DECLARE
msg VARCHAR2(22);
return_msg VARCHAR2(180);
xsbh VARCHAR2(10);
vote_cnt NUMBER := 0;
BEGIN
IF INSERTING THEN
msg := :NEW.msg;
msg := REPLACE(REPLACE(msg, '+', ''), '-', ''); -- 清洗
IF LOWER(SUBSTR(msg,1,1)) = 'v' AND LENGTH(msg) > 3 THEN
IF SYSDATE < TO_DATE('2009-12-26','YYYY-MM-DD') THEN
SELECT COUNT(*) INTO vote_cnt
FROM t_siteuser
WHERE userid = :NEW.source_user
AND TO_CHAR(gentime,'YYYYMMDD') = TO_CHAR(SYSDATE,'YYYYMMDD');
IF vote_cnt <= 20 THEN
xsbh := '候選人編號'; -- 簡化邏輯
INSERT INTO t_siteuser(id, bh, gentime)
VALUES (SEQ_T_SITEUSER.NEXTVAL, xsbh, SYSDATE);
return_msg := '感謝您對' || xsbh || '號的支持!';
ELSE
return_msg := '對不起,網站每天限投 20 票!';
END IF;
ELSE
return_msg := '活動已結束,歡迎繼續關注!';
END IF;
END IF;
-- 實際業務中 return_msg 需返回給前端,此處略過
END IF;
END;
/
-- 測試:INSERT INTO t_table(msg, source_user) VALUES ('v123', 'user001');
該案例涵蓋:DML 事件判斷、:NEW 取值、字符串處理、日期比較、單行查詢賦值、Sequence 取值、條件分支、異常消息構建。